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

kno*_*orv 8 perl utf-8

由于各种原因,我收到错误消息Malformed UTF-8 characterWide 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请见.


cjm*_*cjm 8

no warnings 'utf8';
Run Code Online (Sandbox Code Playgroud)

但最好弄明白为什么你会得到警告并解决潜在的问题.这两个警告表明您的脚本出现了问题.抑制警告不会修复错误.


Lum*_*umi 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
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只会输出字节,然后看起来正确.

  • 在我看来,这是最好的答案,因为它不是告诉新程序员如何关闭“烦人”的警告(如果您不明白为什么会收到它们,则不应该这样做),而是告诉您如何防止收到该警告首先。大多数警告都是为了帮助您解决自己的问题。我在某处听说,99.999% 的情况下,问题出在程序员身上,而不是计算机/编译器/解释器上。关闭这个警告很容易,但是养成关闭烦恼的习惯至少可以说是一个坏习惯。 (2认同)