Perl “;字符显示在csv中
我正在解析一个站点,并使用Perl将内容写入一个csv文件中,我在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, ">
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对其进行解码。这两个必须匹配
两种选择:
:encoding(cp1252)
):encoding(UTF-8)
)一般来说,后者是更好的选择,因为它允许文件包含任何Unicode字符,而不是非常小的子集。我想您可能会看到以下内容:
“HexTab”
相反,您会看到以下内容:
“HexTab�
您正在将文件保存为UTF-8,但读取该文件的程序正在使用cp1252对其进行解码。这两个必须匹配
两种选择:
:encoding(cp1252)
):encoding(UTF-8)
)$ 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
,看看是否有效。如果无效,请尝试cp1250
,latin1
,和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()
更改为另一个。