【问题标题】:Force UTF-8 Byte Order Mark in Perl file output在 Perl 文件输出中强制使用 UTF-8 字节顺序标记
【发布时间】:2011-11-17 03:37:12
【问题描述】:

我正在使用 Perl 写出一个 CSV 文件。进入 CSV 的数据包含 Unicode 字符。我正在使用以下内容写出 CSV:

#OPEN THE FILE FOR WRITE
open(my $fh, ">:utf8", "rpt-".$datestring.".csv")
or die "cannot open < rpt.csv: $!";

这是在文件中正确写入字符,但似乎不包括 UTF8 字节顺序标记。这反过来又让我的用户尝试在 Excel 中打开文件。有没有办法强制写入字节顺序标记?

我尝试了以下方式:

print $fh "\x{EFBBBF};

我在文件顶部看到了乱码。任何帮助将不胜感激。

【问题讨论】:

  • UTF-8 的“字节顺序标记”没有逻辑意义 - UTF8 只有一种可能的字节顺序。我知道各种 Windows 应用程序依赖于“BOM”的存在来触发使用 Unicode 编码而不是 Microsoft 代码页,但是如果您不处理损坏的 MS 应用程序,那么将 BOM 添加到UTF8 文档。
  • @Grant:或者,学究起来:由于 UTF-8 编码为字节流,因此存在 no 字节顺序。字节顺序(或字节序)只对多字节数有意义。
  • @Grant 我原则上同意你的看法。但是我的用户正在使用损坏的 MS 应用程序。因此需要强制 BOM。
  • 强制 BOM 听起来是个好主意,否则无法仅从流中判断其编码是什么。
  • “UTF-8 的‘字节顺序标记’没有逻辑意义”——错误。虽然基于名称决定事物语义的错误概念,但即使该概念是正确的也是错误的......因为 utf8 文件中存在/不存在 BOM 可以被视为暗示存在/不存在 BOM 在它转换为 utf16 或 utf32 文件,允许透明的往返转换。 “如果您不处理损坏的 MS 应用程序” OP 明确提到 Excel。问题不在于是否应该使用 BOM,而在于如何输出它们,这样整个迂腐的旅行就不合适了。

标签: perl utf-8


【解决方案1】:

尝试这样做:

print $fh chr(65279);

打开文件后。

【讨论】:

  • use File::BOM (); open my $fh, '&gt; :utf8 :via(File::BOM)', … 会更清晰。
  • 这不是 UTF-16 BOM 吗?他不应该这样做print $fh pack("CCC",0xef,0xbb,0xbf);虽然这么说,但我只能让FusionCharts(它需要BOM)理解你的例子。
  • @Cosmicnet:否:所有 UTF 字符集的 BOM 使用相同的代码点。不同之处在于文件句柄上启用的编码层。请参阅问题中的open 调用中的:utf8
  • @MooingDuck 问题的标题和内容都反复提到了UTF-8;不涉及 UTF-16。您的假设似乎是基于对 Unicode 的误解。
猜你喜欢
  • 2011-07-13
  • 2012-06-21
  • 1970-01-01
  • 2012-04-17
  • 2016-02-04
  • 2016-03-11
  • 1970-01-01
  • 2011-02-03
相关资源
最近更新 更多