【问题标题】:Print other language character in csv using perl file handling使用 perl 文件处理在 csv 中打印其他语言字符
【发布时间】:2023-03-20 18:22:02
【问题描述】:

我正在抓取一个基于德语的网站,我正在尝试使用 Perl 将网站的内容存储在 CSV 中,但我面临 csv 中的垃圾值,我使用的代码是

    open my $fh, '>> :encoding(UTF-8)', 'output.csv';
    print {$fh} qq|"$title"\n|;
    close $fh;

例如:我期望 Weiß ,Römersandalen ,但我得到 Weiß,Römersandalen

更新:

代码

use strict;
use warnings;
use utf8;
use WWW::Mechanize::Firefox;
use autodie qw(:all);
my $m = WWW::Mechanize::Firefox->new();


print "\n\n *******Program Begins********\n\n";

$m->get($url) or die "unable to get $url";
my $Home_Con=$m->content;
my $title='';


if($Home_Con=~m/<span id="btAsinTitle">([^<]*?)<\/span>/is){
$title=$1;
print "title ::$1\n";
}
open my $fh, '>> :encoding(UTF-8)', 's.txt';      #<= (Weiß)
print {$fh} qq|"$title"\n|;
close $fh;

open $fh, '>> :encoding(UTF-8)', 's1.csv';      #<= (Weiß)

print {$fh} qq|"$title"\n|;
close $fh;

    print "\n\n *******Program ends********";
            <>;

这是代码的一部分。该方法适用于文本文件,但不适用于 csv。

【问题讨论】:

标签: perl csv unicode file-handling


【解决方案1】:

您已经向我们展示了在将数据写入文件时正确编码数据的代码。

我们还需要了解数据如何进入您的程序。您当时是否正确解码?

更新:

如果代码真的只是你在 cmets 中所说的 my $title='Weiß ,Römersandalen',那么解决方案就像在你的代码中添加 use utf8 一样简单。

关键是 Perl 需要知道如何解释它正在处理的字节流。在您的程序之外,数据以各种编码的字节形式存在。您需要在数据进入程序时对其进行解码(解码将字节流转换为字符串)并在离开程序时再次对其进行编码。您正确地执行了编码步骤,但没有正确执行解码步骤。

use utf8 在您给出的简单示例中修复该问题的原因是use utf8 告诉 Perl 您的源代码应该被解释为编码为 utf8 的字节流。然后,它将该字节流转换为包含“Weiß ,Römersandalen”的正确字符的字符串。然后,它可以成功地将这些字符编码为字节,这些字节表示这些字符在写入文件时编码为 utf8。

您的数据实际上来自网页。我假设您正在使用 LWP::Simple 或类似的东西。该数据可能被编码为 utf8(我怀疑它,考虑到您遇到的问题),但它也可能被编码为 ISO-8859-1 或 ISO-8859-9 或 CP1252 或任何数量的其他编码。除非您知道编码是什么并正确解码传入的数据,否则您将看到您得到的结果。

【讨论】:

  • :谢谢戴夫。假设这是代码my $title='Weiß ,Römersandalen'; open my $fh, '&gt;&gt; :encoding(UTF-8)', 'output.csv'; print {$fh} qq|"$title"\n|; close $fh;
  • 但这不是代码。您说您正在从网站上抓取数据。数据如何进入您的程序与如何离开同样重要。
  • 精彩的解释戴夫,非常感谢。该网站基于“iso-8859-15”,我刚刚将 UTC-8 转换为 iso-8859-15。它奏效了。
【解决方案2】:

使用 headtail

等命令检查文件的开头或任何位置是否有任何奇怪的字符

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多