【问题标题】:how to get rid of `Wide character in print at`?如何摆脱`打印中的宽字符`?
【发布时间】:2018-06-05 01:23:04
【问题描述】:

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

00000000 D0 BA D0 B8 │ D1 80 D0 B8 │ D0 BB D0 B8 │ D0 BA     к и р и л и к

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

Wide character in print at ...

来源是:

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

打印的输出是:

кирилик  

【问题讨论】:

  • 你的use utf8 告诉 Perl 源代码文件中有 utf8 字符。你需要打开 STDOUT 支持 utf8 或 binmode 它。
  • @simbabque:这似乎与use utf8 无关:代码完全是ASCII。 /tmp/xx 的第一行很可能包含扩展字符。
  • 我知道@Borodin。这就是我的观点。
  • @simbabque:啊。我把它读成问题是因为代码有use utf8STDOUT 处于字节模式。
  • @simbabque:是的,我现在明白你的意思了

标签: perl unicode file-io


【解决方案1】:

您正在打印到不期望 UTF8 的 STDOUT。 添加

binmode(STDOUT, "encoding(UTF-8)");

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

【讨论】:

  • use open ":std", ":encoding(UTF-8)"; 更好。这也会对 STDIN 和 STDERR 进行二进制模式,并在其词法范围内为 open 设置默认编码层(例如,您可以使用 open my $fh, '&lt;', '/tmp/xxx' 而不是 open my $fh, '&lt;:encoding(UTF-8)', '/tmp/xxx')。
【解决方案2】:

use utf8 表示 Perl 期望您的源代码是 UTF-8。

open pragma 可以改变标准文件句柄的编码:

use open qw( :std :encoding(UTF-8) );

【讨论】:

    猜你喜欢
    • 2018-01-15
    • 1970-01-01
    • 2021-12-06
    • 1970-01-01
    • 2016-10-15
    • 1970-01-01
    • 2010-11-19
    • 2012-11-19
    相关资源
    最近更新 更多