Perl “;字符显示在csv中

Perl “;字符显示在csv中,perl,csv,utf-8,Perl,Csv,Utf 8,我正在解析一个站点,并使用Perl将内容写入一个csv文件中,我在csv上看到内容中的垃圾值 use utf8; my $csv = Text::CSV->new ( { binary => 1, eol => "\n" } ) # should set binary attribute. or die "Cannot use CSV: ".Text::CSV->error_diag (); open my $fh, ">

我正在解析一个站点,并使用Perl将内容写入一个csv文件中,我在csv上看到内容中的垃圾值

use utf8;
my $csv = Text::CSV->new ( { binary => 1, eol => "\n" } )  # should set binary attribute.
or die "Cannot use CSV: ".Text::CSV->error_diag ();                      
open my $fh, ">>:encoding(utf8)", "Test.csv" or die "Test.csv: $!";     
$csv->print($fh, [$title,$content]);  
$csv->eol();
该站点用utf8编码

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
更新2: 谢谢 如果我使用
“>>:encoding(cp1252)”
它解决了引号字符的问题,但会引发一些警告

"\x{03bc}" does not map to cp1252 at c:/Perl/lib/IO/Handle.pm line 417
"\x{ff1c}" does not map to cp1252 at c:/Perl/lib/IO/Handle.pm line 417

我想你会看到以下情况:

“HexTab”
相反,您会看到以下内容:

“HexTab�
您正在将文件保存为UTF-8,但读取该文件的程序正在使用cp1252对其进行解码。这两个必须匹配

两种选择:

  • 如果读取器要继续使用cp1252对文本进行解码,请使用cp1252对文本进行编码(
    :encoding(cp1252)
  • 如果要将文件编码为UTF-8,请让读取器使用UTF-8对其进行解码(
    :encoding(UTF-8)

  • 一般来说,后者是更好的选择,因为它允许文件包含任何Unicode字符,而不是非常小的子集。

    我想您可能会看到以下内容:

    “HexTab”
    
    相反,您会看到以下内容:

    “HexTab�
    
    您正在将文件保存为UTF-8,但读取该文件的程序正在使用cp1252对其进行解码。这两个必须匹配

    两种选择:

  • 如果读取器要继续使用cp1252对文本进行解码,请使用cp1252对文本进行编码(
    :encoding(cp1252)
  • 如果要将文件编码为UTF-8,请让读取器使用UTF-8对其进行解码(
    :encoding(UTF-8)
  • 一般来说,后者是更好的选择,因为它允许文件包含任何Unicode字符,而不是非常小的子集。

    在大多数Unix系统上有一个程序,可以将文件从一种编码重新编码到另一种编码。您需要确定文件的原始编码

    您将以以下方式运行iconv:

    $ iconv -f utf8 -t cp1252 $file_name.csv > $new_file_name.csv
    
    这将转换使用默认代码页1252在Windows中编写的文件,并将其转换为UTF-8编码。我会先试试cp1252,看看它是否有效。如果没有,请尝试
    cp1250
    latin1
    macintosh
    (它可能是用创建的文件)

    查看iconv是否可以解决此问题。

    在大多数Unix系统上都有一个调用的程序,可以将文件从一种编码重新编码到另一种编码。您需要确定文件的原始编码

    您将以以下方式运行iconv:

    $ iconv -f utf8 -t cp1252 $file_name.csv > $new_file_name.csv
    
    这将转换使用默认代码页1252在Windows中编写的文件,并将其转换为UTF-8编码。我将首先尝试cp1252,看看是否有效。如果无效,请尝试cp1250latin1,和macintosh(它可能是使用创建的文件)



    看看iconv是否能解决这个问题。

    你可能忘了解码你的输入。使用Data::Dumper;local$Data::Dumper::Useqq=1;print(Dumper($title,$content));你看到UTF-8显示器(编辑器或shell)中的
    字符了吗?然后您将对数据进行双重编码。请尝试删除
    :编码(utf8)
    output layer.@nwellnhof,最好对所有输入进行解码,而不是同时处理解码和编码的字符串。我不同意您的解决方案。@ikegami:我怀疑Text::CSV已经对UTF-8字符串进行了编码,并且使用IO层对输出进行了两次编码。@nwellnhof,没有。您可能忘记了对输入进行解码。问题是什么
    use Data::Dumper;local$Data::Dumper::Useqq=1;print(Dumper($title,$content));
    您是否在支持UTF-8的显示器(编辑器或shell)中看到
    字符?
    字符?然后您对数据进行了双重编码。尝试删除
    :编码(utf8)
    output layer.@nwellnhof,最好对所有输入进行解码,而不是同时处理解码和编码的字符串。我不同意你的解决方案。@ikegami:我怀疑Text::CSV已经对UTF-8字符串进行了编码,并且使用IO层对输出进行了两次编码。@nwellnhof,没有。谢谢。你说得对。我误解了方向。我很抱歉我会更新我的答案。他为什么不直接使用:编码(cp1252)而不是:编码(UTF-8)+iconv?他可以。我认为他的问题是他用Perl程序读取CVS文件,而CVS文件的编码错误。他是用Perl从网页创建CVS。他没有指定读取内容。如果是Perl脚本,那只是更改一个
    :encoding()
    在这种情况下,还有一个问题。谢谢。你是对的。我误解了方向。我会更新我的答案。他为什么不直接使用:编码(cp1252)而不是:编码(UTF-8)+iconv?他可以。我认为他的问题是他用Perl程序读取CVS文件,而CVS文件的编码错误。他是用Perl从网页创建CVS。他没有指定读取内容。如果是Perl脚本,那么在这种情况下,也只是将一个
    :encoding()
    更改为另一个。