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

时间:2015-02-23 16:26:28

标签: perl encoding utf-8

我正在用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';,但没有用。

如何取消消息?

1 个答案:

答案 0 :(得分:3)

您可以自己进行解码,而不是使用:encoding图层。默认情况下,编码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的混合,则可以修复文件而不是简单地消除错误,详见here