由于各种原因,我收到错误消息Malformed UTF-8 character
和
来自遗留脚本的Wide character in print
。
我想抑制/禁用这两个警告,以便它们不会写入STDERR
。
我该怎么做?
答案 0 :(得分:12)
据推测,您正在使用utf8。您必须为每个文件句柄启用utf8处理。
binmode STDERR, ":encoding(utf8)";
您可以使用use open ":encoding(utf8)"
对所有标准句柄执行此操作。有关详细信息,请参阅open。
最后,您可以使用utf8::all来确定所有内容,代码,文件句柄和参数。
注意 :utf8
启用utf8处理但:encoding(utf8)
检查数据是否有效utf8,因此更安全。有关详细信息,请参阅perldoc -f binmode
。
答案 1 :(得分:8)
no warnings 'utf8';
但最好弄清楚为什么你会收到警告并解决潜在的问题。这两个警告表明您的脚本出现了问题。抑制警告不会修复错误。
答案 2 :(得分:5)
以下两个示例可帮助您了解错误:
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
源是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.
Группа сайтов РИА Новости
源包含西里尔字符,因此utf8
编译指示是有序的。但是,要将这些字符打印到终端,STDOUT
也必须设置为UTF-8,您可以通过调用binmode
来实现。如果不这样做,则会触发警告,因为宽(超过0x255的Unicode)字符不适合通过窄(字节)输出通道。它看起来仍然是正确的,因为Perl只会输出字节,然后看起来是正确的。
答案 3 :(得分:2)
在Windows Powershell控制台上使用Perl从log4perl调试输出出现同样的问题
Wide character in print at C:/strawberry/perl/site/lib/Log/Log4perl/Appender/Screen.pm line 39.
解决方案是(在log4perl配置文件中)
log4perl.appender.Screen.utf8 = 1