我的脚本开头有以下代码段:
#!/usr/bin/perl5 -w
use strict;
binmode(STDIN, ":utf8");
binmode(STDOUT, ":utf8");
binmode(STDERR, ":utf8");
在某些子例程中,当有其他编码(来自遥远的子例程)时,在接收西里尔字母或其他字符时,数据将无法正确显示。导致此问题的是“ binmode”。
我可以在本地“关闭” binmode utf8(仅用于子例程)吗?
我无法删除全局binmode设置,也无法更改远距离编码。
最佳答案
实现此目的的一种方法是“复制” STD
句柄,将重复的文件句柄设置为使用:raw
层,然后将其分配给STD
句柄的本地版本。例如下面的代码
binmode(STDOUT, ':utf8');
print(join(', ', PerlIO::get_layers(STDOUT)), "\n");
{
open(my $duped, '>&', STDOUT);
# The ':raw' argument could also be omitted.
binmode($duped, ':raw');
local *STDOUT = $duped;
print(join(', ', PerlIO::get_layers(STDOUT)), "\n");
close($duped);
}
print(join(', ', PerlIO::get_layers(STDOUT)), "\n");
版画
unix, perlio, utf8
unix, perlio
unix, perlio, utf8
在我的系统上。