在 Perl 中读取 utf-8 文件时如何清除非 utf 字符?

How to clear non-utf characters while reading a utf-8 file in Perl?

我正在用 Perl 解析一个非常大的日志文件。 代码是:

open($input_handle, '<:encoding(UTF-8)', $input_file);    

while (<$input_handle>)  {                   
...
}
close($input_handle);    

但是,有时日志文件包含错误字符,我收到以下消息:

utf8 "\xD0" does not map to Unicode at log_parser.pl line 32, <$input_handle> line 10920.

我知道这些字符,我只想忽略它们,以免日志消息淹没我的 (Windows!) 构建服务器日志。我试过 no warnings 'utf8'; 但没有用。

我怎样才能隐藏消息?

您可以自己解码而不是使用 :encoding 层。默认情况下,Encode 的 decodedecode_utf8 只是用 U+FFFD 交换坏字符而不是警告。

$ perl -e'
   use Encode qw( decode_utf8 );
   $bytes = "\xD0 \x92 \xD0\x92\n";
   $text = decode_utf8($bytes);
   printf("U+%v04X\n", $text);
'
U+FFFD.0020.FFFD.0020.0412.000A

如果文件是 UTF-8、iso-8859-1 和 cp1252 的混合,则可以修复文件而不是简单地消除错误,详见