17 December 2005
This post may be outdated due to it was written on 2005. The links may be broken. The code may be not working anymore. Leave comments if needed.
首先介绍下 Encode::Guess 的用途。
我们知道一个文件有很多种编码,最常见的就是 ASCII 和 utf8
如果你从外面读入一个文件,想把它 decode 时却不知道该指定何种编码时非常有用。
一般的代码是:
use Encode;
use Encode::Guess qw/euc-cn/;

my $word = "直到";
my $enc = Encode::Guess->guess($word);
die $! unless ref($enc);
print $enc->name;

如果该代码文件是 utf8 模式下编辑时,它输出的是 utf8; 不在 Unicode Editing 模式下很可能输出 euc-cn
然后你要解码的话就可以指定它的编码了:
$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;
unless (ref($enc)) {
   $encoding = 'euc-cn'; # use 'enc-cn' by default
} else {
   $encoding = $enc->name;
}
$word = decode($encoding, $word);
默认没有猜测成功的话就指定该编码为 enc-cn.
因为我认为猜测 utf8 总是会成功的,不成功的话就应该是 enc-cn.
试了下 Unihan_value("直") 一切 OK!

:-)



blog comments powered by Disqus