由于各种原因,我收到错误消息Malformed UTF-8 character和
Wide character in print遗留脚本.
我想抑制/禁用这两个警告,以便它们不被写入STDERR.
我怎么做?
Sch*_*ern 12
大概你在utf8工作.您必须为每个文件句柄启用utf8处理.
binmode STDERR, ":encoding(utf8)";
Run Code Online (Sandbox Code Playgroud)
您可以使用所有标准句柄执行此操作use open ":encoding(utf8)".有关详细信息,请参阅open.
最后,你可以使用utf8 :: all来utf8-ify所有内容,代码,文件句柄和参数.
请注意,:utf8打开utf8处理但:encoding(utf8)检查数据是否有效utf8,因此更安全.详情perldoc -f binmode请见.
no warnings 'utf8';
Run Code Online (Sandbox Code Playgroud)
但最好弄明白为什么你会得到警告并解决潜在的问题.这两个警告表明您的脚本出现了问题.抑制警告不会修复错误.
以下两个示例可帮助您了解错误:
milu@ubuntu: ~/Milu/Dev/Perl > cat malformed-utf8-char.pl
use utf8; # script source must be in UTF-8
use strict;
use warnings;
print "K?se\n";
milu@ubuntu: ~/Milu/Dev/Perl > perl malformed-utf8-char.pl
Malformed UTF-8 character (unexpected non-continuation byte 0x73,
immediately after start byte 0xe4) at malformed-utf8-char.pl line 4.
Kse
Run Code Online (Sandbox Code Playgroud)
源是Latin-1,我的终端是UTF-8.该字符串实际上是"Käse".utf8必须删除该编译指示,或者将源保存为UTF-8.
milu@ubuntu: ~/Milu/Dev/Perl > cat wide-char-in-print.pl
use utf8;
use strict;
use warnings;
# binmode STDOUT, ':utf8';
print "?????? ?????? ??? ???????\n";
milu@ubuntu: ~/Milu/Dev/Perl > perl wide-char-in-print.pl
Wide character in print at wide-char-in-print.pl line 5.
?????? ?????? ??? ???????
Run Code Online (Sandbox Code Playgroud)
源包含西里尔字符,因此utf8编译指示是有序的.但是,要将这些字符打印到终端,STDOUT还必须设置为UTF-8,您可以通过调用来实现binmode.如果不这样做,则会触发警告,因为宽(超过0x255的Unicode)字符不适合通过窄(字节)输出通道.它看起来仍然是正确的,因为Perl只会输出字节,然后看起来正确.