用perl bug写utf8?

时间:2012-12-14 07:58:30

标签: perl utf-8 output

我的问题很简单。我想用我的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。可能是什么问题?

1 个答案:

答案 0 :(得分:10)

您只使用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。

当然,有一些例外,其中文件格式包含指示文件编码的某些指令。通过DOCTYPE声明可以想到XML。但是,即使对于此类文件,您也必须识别文件是否以多字节编码进行编码,每个字符始终使用至少两个字节(UTF-16 / UTF-32),以便解析{{1首先声明。这简直不简单;)