readpipe在什么编码中返回执行命令的结果?

时间:2016-05-02 14:20:31

标签: perl character-encoding

这是一个简单的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 文件 文本。

这对我来说有点奇怪。这种行为有什么解释?

1 个答案:

答案 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