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

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 utf8STDOUT 处于字节模式。 @simbabque:是的,我现在明白你的意思了 【参考方案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) );

【讨论】:

以上是关于如何摆脱`打印中的宽字符`?的主要内容,如果未能解决你的问题,请参考以下文章

如何消除 TT 的“打印中的宽字符”警告?

C 中的宽字符输入/输出是不是总是从正确的(系统默认)编码读取/写入?

IO库中的宽字符语言

如何在 windows 和 linux 上使用相同的宽字符字符串格式

在C(GCC)中的宽字符串上调用goto

Linux 上 __FUNCTION__ 的宽版本