这是一个简单的perl脚本,应该写一个utf-8编码文件:
use warnings;
use strict;
open (my $out, '>:encoding(utf-8)', 'tree.out') or die;
print $out readpipe ('tree ~');
close $out;
我期望readpipe返回utf-8编码的字符串,因为LANG
设置为en_US.UTF-8
。但是,查看tree.out
(同时确保编辑器将其识别为utf-8编码)会向我显示所有乱码文本。
如果我将open语句中的>:encoding(utf-8)
更改为>:encoding(latin-1)
,脚本会创建一个带有预期的 utf-8 文件
文本。
这对我来说有点奇怪。这种行为有什么解释?
答案 0 :(得分:2)
readpipe
返回perl一串未解码的字节。我们知道该字符串是UTF-8编码的,但您没有告诉Perl。
输出句柄上的IO层正在接受该字符串,假设它是Unicode代码点并将它们重新编码为UTF-8字节。
latin-1 IO层看起来运行正常的原因是它正在写出每个未解码的字节,因为第一个256个unicode代码点与latin-1很好地对应。
正确的做法是将decode
返回的readpipe
字节串转换为代码点字符串,然后再将其提供给IO层。正如Borodin所提到的,use open ':utf8'
这一陈述应该是一个可行的解决方案,因为open
manual page中特别提到了readpipe
。