【发布时间】: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,而在于如何输出它们,这样整个迂腐的旅行就不合适了。