如何在Perl中抑制UTF-8警告?

时间:2011-06-02 22:24:19

标签: perl utf-8

由于各种原因,我收到错误消息Malformed UTF-8 character和 来自遗留脚本的Wide character in print

我想抑制/禁用这两个警告,以便它们不会写入STDERR

我该怎么做?

4 个答案:

答案 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