【问题标题】:“ character are shown in the csv- 字符显示在 csv 中
【发布时间】: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: 谢谢 如果我使用"&gt;&gt;: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,它没有。

标签: perl csv utf-8


【解决方案1】:

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

您可以将 iconv 运行为:

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

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

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

【讨论】:

  • 谢谢。你说得对。我误解了方向。我会更新我的答案。
  • 他为什么不直接使用 :encoding(cp1252) 而不是 :encoding(UTF-8) + iconv?
  • 他可以。我以为他的问题是他正在用 Perl 程序读取 CVS 文件,而 CVS 文件的编码错误。
  • 他正在使用 Perl 从网页创建 CVS。他没有具体说明在读什么。如果它是一个 Perl 脚本,那么在这种情况下也只是将一个 :encoding() 更改为另一个。
【解决方案2】:

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

“HexTab”

您会看到以下内容:

“HexTab�

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

两种选择:

  1. 如果读者打算继续使用 cp1252 解码文本,则使用 cp1252 (:encoding(cp1252)) 对文本进行编码。
  2. 如果您要将文件编码为 UTF-8 (:encoding(UTF-8)),请让阅读器使用 UTF-8 解码文件。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-16
    • 1970-01-01
    • 2013-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-08
    • 2023-03-17
    相关资源
    最近更新 更多