【发布时间】:2013-10-23 06:33:12
【问题描述】:
我正在解析一个站点并使用 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"/>
我该如何解决这个问题?
更新:
@ikegami:谢谢,您的代码输出给出的字符与
相同\x{201c}HexTab\x{201d}
更新 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
【问题讨论】:
-
您可能忘记解码您的输入。
use Data::Dumper; local $Data::Dumper::Useqq = 1; print(Dumper($title,$content));的输出是什么 -
您是否在支持 UTF-8 的显示器(编辑器或外壳)中看到
“字符?然后你对你的数据进行双重编码。尝试删除:encoding(utf8)输出层。 -
@nwellnhof,最好解码所有输入,而不是同时处理解码和编码字符串。我不同意你的解决方案。
-
@ikegami:我怀疑 Text::CSV 已经对 UTF-8 字符串进行了编码,并且使用 IO 层对输出进行了两次编码。
-
@nwellnhof,它没有。