我尝试在Windows上用Perl写入Unicode(UCS-2 Little Endian)文件,如下所示。
open my $f, ">$fName" or die "can't write $fName\n";
binmode $f, ':raw:encoding(UCS-2LE)';
print $f, "ohai\ni can haz unicodez?\nkthxbye\n";
close $f;
它基本上可以工作,只是我不再像在普通文本文件中那样在输出中得到LF -〉CR/LF的自动转换。(输出文件只有LF)如果我在“binmode”调用中省略了:raw或add:crlf,那么输出文件就会变成乱码。我试过重新排序“directives”(即:encoding before:raw),但无法使其工作。同样的问题也存在于阅读中。
3条答案
按热度按时间lbsnaicq1#
这对我在windows上很有效:
在test.txt中生成UCS-16 LE输出
wnrlj8wa2#
下面是我发现的工作方式,至少在perl5.10.1中是这样的:
输入:
输出量:
它们透明地处理BOM、CRLF转换和UTF-16 LE编码/解码。
请注意,根据perlmonks下面的帖子,如果尝试使用binmode()而不是open()指定,则需要额外的“:pop”:
这也是我的经验所证实的。但是,我无法让这个与“:via(File::BOM)”层一起工作。
参考文献:
http://www.perlmonks.org/?node_id=608532
http://metacpan.org/pod/File::BOM
khbbv19g3#
:crlf
层在输出流中进行0x 0A-〉0x 0 D 0x 0A(\n --> \r\n
)的简单字节Map,但在大多数情况下,这在任何宽字符编码中都无效。使用原始模式但显式打印CR怎么样?
或者,如果需要考虑可移植性,请找出并明确使用正确的行尾:
与这个问题无关,但Ωmega在一条评论中提到了
:raw
和:bytes
之间的区别。正如perldoc perlio
中所述,可以将:raw
视为删除所有I/O层,将:bytes
视为删除一个:utf8
层。比较这两个命令的输出: