【问题标题】:write utf8 with perl bug?用 perl 错误编写 utf8?
【发布时间】:2012-12-14 07:58:29
【问题描述】:

我的问题很简单。我想用我的 Perl 脚本输出 UTF-8。 此代码无效。

use utf8;
open(TROIS,">utf8.out.2.txt");
binmode(TROIS, ":utf8");
print TROIS "Hello\n";         

输出文件不是 UTF-8 格式。 (我的文件脚本是用 UTF-8 编码的) 但是,如果我在print 中插入一个重音字符,那么它就可以工作并且我的输出文件是 UTF-8。示例:

print TROIS "é\n";

我在 Windows 下使用 ActivePerl 5.10。可能是什么问题?

【问题讨论】:

  • 你写的只是带有Hello\n的ASCII字符。幸运的是,ASCII 仍然是完全有效的 UTF-8。但是,编辑器的自动检测很可能不会在编码时显示 UTF-8,因为他们没有任何东西可以判断文件内容的编码。我猜你根本不知道文件编码是如何工作的。
  • 感谢您的解释。
  • @Moritz:请发表您的解释作为答案。然后 user1903343 应将其标记为已接受,以便此问题不再显示为“未解决”。
  • 非常正确。这样做是为了提供更多信息。

标签: perl utf-8 output


【解决方案1】:

您使用Hello\n 编写的只是ASCII 字符。幸运的是,ASCII 仍然是完全有效的 UTF-8。但是,编辑器的自动检测很可能不会将 UTF-8 显示为编码,因为他们没有任何东西可以判断文件内容的编码。我猜你根本不知道文件编码是如何工作的。

文件的编码是一种属性,通常不存储在文件中或与文件一起存储在外部。许多编辑器只是根据他们运行的操作系统或环境设置(系统语言)假设某种编码,或者它们包含某种半智能自动检测(由于文件编码不能自动检测,这可能仍然失败)明确地检测到)。这就是为什么当你使用binmode 或相应的 I/O 层读取文件时,你必须告诉 Perl 文件是用 UTF-8 编码的。

如果文本文件的编码是 UTF 系列之一(UTF-8、UTF-16 LE 和 BE、UTF-32 LE 和 BE),现在有一种方法可以标记文本文件的编码。这种方式称为BOM (byte order mark)。但是,使用 BOM 生成文件的时候,UTF-8 还没有像今天这样广泛传播。它通常会带来比它解决的更多和不同的问题,尤其是由于编辑器和应用程序通常根本不支持 BOM。因此,现在应该避免使用 BOM。

当然,也有例外,其中文件格式包含某些说明文件编码的指令。 XML 的 DOCTYPE 声明浮现在脑海中。但是,即使对于此类文件,您也必须识别文件是否以每个字符至少使用两个字节(UTF-16/UTF-32)的多字节编码进行编码,以便解析DOCTYPE首先声明。这根本不简单;)

【讨论】:

    猜你喜欢
    • 2012-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-28
    相关资源
    最近更新 更多