<分区>
我有时不得不从外部来源读取文本文件,这些文件可以使用各种字符编码;通常是 UTF-8、Latin-1 或 Windows CP-1252。
有没有办法方便地读取这些文件,像 Vim 等编辑器一样自动检测编码?
我希望得到像这样简单的东西:
open(my $f, '<:encoding(autodetect)', 'foo.txt') or die 'Oops: $!';
请注意 Encode::Guess不能解决问题:它仅在可以明确检测到编码时才有效,否则它会发出声音。大多数 UTF-8 数据名义上是有效的 latin-1 数据,因此它在 UTF-8 文件上失败。
例子:
#!/usr/bin/env perl
use 5.020;
use warnings;
use Encode;
use Encode::Guess qw(utf-8 cp1252);
binmode STDOUT => 'utf8';
my $utf8 = "H\x{C3}\x{A9}llo, W\x{C3}\x{B8}rld!"; # "Héllo, Wørld!" in UTF-8
my $latin = "H\x{E9}llo, W\x{F8}rld!"; # "Héllo, Wørld!" in CP-1252
# Version 1
my $enc1 = Encode::Guess->guess($latin);
if (ref($enc1)) {
say $enc1->name, ': ', $enc1->decode($latin);
}
else {
say "Oops: $enc1";
}
my $enc2 = Encode::Guess->guess($utf8);
if (ref($enc2)) {
say $enc2->name, ': ', $enc2->decode($utf8);
}
else {
say "Oops: $enc2";
}
# Version 2
say decode("Guess", $latin);
say decode("Guess", $utf8);
输出:
cp1252: Héllo, Wørld!
Oops: utf-8-strict or utf8 or cp1252
Héllo, Wørld!
cp1252 or utf-8-strict or utf8 at ./guesstest line 32.
Borodin 的回答中“更新”下的版本仅适用于 UTF-8 数据,但适用于 Latin-1 数据。
如果您需要同时处理 UTF-8 和 Latin-1 文件,则不能使用 Encode::Guess
。
这不是与 this one 相同的问题: 我正在寻找一种在打开文件时自动检测的方法。