【问题标题】:How do I suppress UTF-8 warnings in Perl?如何在 Perl 中抑制 UTF-8 警告?
【发布时间】:2011-09-07 10:38:36
【问题描述】:

由于各种原因,我收到了错误消息 Malformed UTF-8 characterWide character in print 来自旧脚本。

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

我该怎么做?

【问题讨论】:

    标签: perl utf-8


    【解决方案1】:

    在 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
    

    【讨论】:

      【解决方案2】:

      这里有两个例子可以帮助你理解错误:

      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 来实现。如果您不这样做,则会触发警告,因为宽(Unicode 超过 0x255)字符不适合窄(字节)输出通道。它看起来仍然正确,因为 Perl 只会按原样输出字节,然后恰好看起来正确。

      【讨论】:

      • 在我看来这是最好的答案,因为不是告诉新程序员如何关闭“烦人”警告,如果你不明白为什么你会得到它们,你不应该这样做,它告诉您如何首先防止收到该警告。大多数警告都是为了帮助您解决问题。我在某处听说 99.999% 的时间是程序员,而不是计算机/编译器/解释器是问题所在。关闭此警告很容易,但养成关闭烦恼的习惯至少可以说是不好的。
      【解决方案3】:

      大概你正在使用 utf8。您必须为每个文件句柄打开 utf8 处理。

      binmode STDERR, ":encoding(utf8)";
      

      您可以使用use open ":encoding(utf8)" 对所有标准句柄执行此操作。请参阅open 了解更多信息。

      最后,您可以使用 utf8::all 对所有内容、代码、文件句柄和参数进行 utf8 化处理。

      注意:utf8开启utf8处理但:encoding(utf8)检查数据是否有效utf8,所以更安全。详情请见perldoc -f binmode

      【讨论】:

        【解决方案4】:
        no warnings 'utf8';
        

        但最好弄清楚您收到警告的原因并解决根本问题。这两个警告表明您的脚本出现问题。抑制警告不会修复错误。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-01-12
          • 1970-01-01
          • 2019-02-25
          • 2011-03-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多