如何摆脱`打印中的宽字符`?
Posted
技术标签:
【中文标题】如何摆脱`打印中的宽字符`?【英文标题】: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 utf8
但STDOUT
处于字节模式。
@simbabque:是的,我现在明白你的意思了
【参考方案1】:
您正在打印到不期望 UTF8 的 STDOUT。 添加
binmode(STDOUT, "encoding(UTF-8)");
在已打开的句柄上更改它。
【讨论】:
use open ":std", ":encoding(UTF-8)";
更好。这也会对 STDIN 和 STDERR 进行二进制模式,并在其词法范围内为 open
设置默认编码层(例如,您可以使用 open my $fh, '<', '/tmp/xxx'
而不是 open my $fh, '<:encoding(UTF-8)', '/tmp/xxx'
)。【参考方案2】:
use utf8
表示 Perl 期望您的源代码是 UTF-8。
open
pragma 可以改变标准文件句柄的编码:
use open qw( :std :encoding(UTF-8) );
【讨论】:
以上是关于如何摆脱`打印中的宽字符`?的主要内容,如果未能解决你的问题,请参考以下文章
C 中的宽字符输入/输出是不是总是从正确的(系统默认)编码读取/写入?