3

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

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

输出文件不是 UTF-8 格式。(我的文件脚本是用 UTF-8 编码的)但是如果我在我print的 . 例子:

print TROIS "é\n";

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

4

1 回答 1

10

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

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

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

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

于 2012-12-14T09:14:54.197 回答