Category: MyCPAN Keywords: Encode::Guess Lingua::Han::Utils
首先介绍下 Encode::Guess 的用途。我们知道一个文件有很多种编码,最常见的就是 ASCII 和 utf8
如果你从外面读入一个文件,想把它 decode 时却不知道该指定何种编码时非常有用。
一般的代码是:
use Encode;如果该代码文件是 utf8 模式下编辑时,它输出的是 utf8; 不在 Unicode Editing 模式下很可能输出 euc-cn
use Encode::Guess qw/euc-cn/;my $word = "直到";
my $enc = Encode::Guess->guess($word);
die $! unless ref($enc);
print $enc->name;
然后你要解码的话就可以指定它的编码了:
$word = decode($enc->name, $word);可是今天发现 Encode::Guess 不太美好的地方。
当我测试 $word = "直到" 时,在 utf8 和非 Unicode Editing 时都解码正常。
但测试 $word = "直" 时,在非 Unicode Editing 时却出错,它没有猜测成功。我本来在 Lingua::Han::Utils 里就是用 die $! unless ref($enc); 的,所以测试 Unihan_value("直") 时会出错。
后来想想,把它改成了:
my $encoding;默认没有猜测成功的话就指定该编码为 enc-cn.
unless (ref($enc)) {
$encoding = 'euc-cn'; # use 'enc-cn' by default
} else {
$encoding = $enc->name;
}
$word = decode($encoding, $word);
因为我认为猜测 utf8 总是会成功的,不成功的话就应该是 enc-cn.
试了下 Unihan_value("直") 一切 OK!:-)