在 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 的 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 的混合,则可以修复文件而不是简单地消除错误,详见 。
我正在用 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 的 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 的混合,则可以修复文件而不是简单地消除错误,详见