我的问题很简单.我想用我的Perl脚本输出UTF-8.此代码无效.
use utf8;
open(TROIS,">utf8.out.2.txt");
binmode(TROIS, ":utf8");
print TROIS "Hello\n";
Run Code Online (Sandbox Code Playgroud)
输出文件不是UTF-8.(我的文件脚本以UTF-8编码)但是如果我在我的插入一个突出的字符print,那么它正在工作,我的输出文件是UTF-8.例:
print TROIS "é\n";
Run Code Online (Sandbox Code Playgroud)
我在Windows下使用ActivePerl 5.10.可能是什么问题?
Mor*_*kus 10
你只写ASCII字符Hello\n.幸运的是,ASCII仍然是完全有效的UTF-8.但是,编辑器的自动检测很可能不会将UTF-8显示为编码,因为它们没有任何东西来判断文件内容的编码.我猜你根本不知道文件编码是如何工作的.
文件的编码是一种属性,通常不存储在文件中或文件外部.许多编辑器根据他们运行的操作系统或环境设置(系统语言)简单地假设某种编码,或者它们包括某种半智能自动检测(由于文件编码不能自动执行,因此可能仍会失败)毫无疑问地检测到).这就是为什么你必须告诉Perl当你用binmode相应的I/O层读取文件时,文件是用UTF-8编码的.
现在有一种标记文本文件编码的方法,如果所述编码是UTF系列之一(UTF-8,UTF-16 LE和BE,UTF-32 LE和BE).这种方式称为BOM(字节顺序标记).但是,生成带有BOM的文件来自UTF-8尚未像今天这样广泛传播的时间.它通常会带来比它解决的更多不同的问题,特别是由于编辑器和应用程序通常根本不支持BOM.因此,现在应该避免使用BOM.
当然,也有例外,其中文件格式包含指示文件编码的某些指令.通过DOCTYPE声明可以想到XML .但是,即使对于这样的文件,您也必须识别文件是否以多字节编码进行编码,每个字符始终使用至少两个字节(UTF-16/UTF-32),以便解析DOCTYPE声明中的声明.第一名.这简直不简单;)