"关闭"binmode(STDOUT,":utf8")本地

Dan*_*rov 4 perl local utf-8 binmode

我的脚本开头有以下块:

#!/usr/bin/perl5 -w
use strict;
binmode(STDIN, ":utf8");
binmode(STDOUT, ":utf8");
binmode(STDERR, ":utf8");
Run Code Online (Sandbox Code Playgroud)

在某些子程序中,当存在其他编码时(来自远程子程序),当接收西里尔字符或其他字符时,数据将无法正确显示.它是"binmode",导致问题.

我可以在本地"关闭"binmode utf8,仅用于子程序吗?

我无法删除全局binmode设置,我无法更改远程编码.

nwe*_*hof 7

实现此目的的一种方法是" 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");
Run Code Online (Sandbox Code Playgroud)

版画

unix, perlio, utf8
unix, perlio
unix, perlio, utf8
Run Code Online (Sandbox Code Playgroud)

在我的系统上.