我正在用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';
,但没有用。
如何取消消息?
答案 0 :(得分:3)
您可以自己进行解码,而不是使用:encoding
图层。默认情况下,编码decode
和decode_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。