Journal(2005) | Blog(2006) | RandomLink | WhoAmI | LiveBookmark | HomePage

<<Previous: Catalyst Advent Calendar 中文版  >>Next: modperl Filter Part1

Lingua::Han::Utils 和 Encode::Guess

Category: MyCPAN   Keywords: Encode::Guess Lingua::Han::Utils

首先介绍下 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!

:-)

<<Previous: Catalyst Advent Calendar 中文版  >>Next: modperl Filter Part1

Options: +Del.icio.us

Related items Created on 2005-12-17 02:00:23, Last modified on 2005-12-17 02:00:43
Copyright 2004-2005 All Rights Reserved. Powered by Eplanet && Catalyst 5.62.