如何摆脱`印刷品中的宽字符?

Eug*_*kov 2 unicode perl file-io

我有/tmp/xxx下一个内容的文件:

00000000 D0 BA D0 B8 ? D1 80 D0 B8 ? D0 BB D0 B8 ? D0 BA     ? ? ? ? ? ? ?
Run Code Online (Sandbox Code Playgroud)

当我读取文件的内容并打印它时,我收到错误:

Wide character in print at ...
Run Code Online (Sandbox Code Playgroud)

来源是:

use utf8;
open my $fh, '<:encoding(UTF-8)', '/tmp/xxx';
print scalar <$fh>
Run Code Online (Sandbox Code Playgroud)

print的输出是:

???????  
Run Code Online (Sandbox Code Playgroud)

jan*_*anh 7

你打印到STDOUT,这是不期望UTF8.加

binmode(STDOUT, "encoding(UTF-8)");
Run Code Online (Sandbox Code Playgroud)

在已打开的句柄上更改它.

  • `use open":std",":encoding(UTF-8)";`更好.这也是对STDIN和STDERR进行binmodes,并在其词法范围内设置`open`的默认编码层(例如,你可以使用`open my $ fh,'<','/ tmp/xxx'`而不是`打开我的$ fh,'<:encoding(UTF-8)','/ tmp/xxx'`). (5认同)
  • @mirabilos同样,您可以为需要不同编码的其他文件覆盖它(通过在`open`中使用`:encoding(...)`) (2认同)

bri*_*foy 5

use utf8意味着Perl希望您的源代码为UTF-8。

open编译可以更改标准文件句柄的编码:

use open qw(:std :utf8);
Run Code Online (Sandbox Code Playgroud)

  • 谢谢。这应该是公认的答案。我认为标准文件句柄的 UTF-8 编码现在应该成为 Perl 的默认编码。 (4认同)