“字符显示在csv中

时间:2013-10-15 12:40:02

标签: 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, ">>: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

2 个答案:

答案 0 :(得分:3)

我认为你希望看到以下内容:

“HexTab”

你会看到以下内容:

“HexTab�

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

两个选项:

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

答案 1 :(得分:1)

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

您可以将iconv作为:

运行
$ iconv -f utf8 -t cp1252 $file_name.csv > $new_file_name.csv

这将使用默认代码页1252转换在Windows中编写的文件,并将其转换为UTF-8编码。我首先尝试cp1252,看看是否有效。如果没有,请尝试cp1250latin1macintosh(它可能是使用MacRoman创建的文件。

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