2009年4月2日星期四

[PerlChina] Re: 使用 Encode::Guess 遇到的��



2009/3/20 Tian Yazhou <phio.asia@gmail.com>


2009/3/20 Calvin <calvin.ngei@gmail.com>:

> 可是,即使用 $string=decode_utf8($string) 先标记让perl明白它是一个字串,用 Encode::Guess 猜编
> 码仍然出错,比如下面的脚本:
>
> #!/usr/bin/perl
> use Encode;
> use Encode::Guess qw/utf8 euc-cn gbk utf-16le/;
> $string="出征进行曲";
> $string=decode_utf8($string);
> $string=encode('gbk',$string);
> print $string;
> $decoder=guess_encoding($string);
> $info=$decoder->decode($string);
> print "$info\n";
>
> 这里运行的错误仍然如下:
> Can't locate object method "decode" via package "euc-cn or cp936 or
> UTF-16LE" (perhaps you forgot to load "euc-cn or cp936 or UTF-16LE"?)
> at ./test.pl line 9.
>
=head1 说明
我稍微改了下你的脚本,你看看
=cut

use Encode;
 
# 可能的编码个数越少越好,我不清楚euc-cn和gbk是什么关系,有人知道么?
刚好今天看到了这个
http://search.cpan.org/~dankogai/Encode-2.33/lib/Encode/Supported.pod

Standard      DOS/Win Macintosh                Comment/Reference
----------------------------------------------------------------
euc-cn [1] MacChineseSimp
(gbk) cp936 [2]
gb12345-raw { GB12345 without CES }
gb2312-raw { GB2312 without CES }
hz
iso-ir-165
----------------------------------------------------------------

[1] GB2312 is aliased to this. See L<Microsoft-related naming mess>
[2] gbk is aliased to this. See L<Microsoft-related naming mess>

# 我发现去掉gbk好像还是可以猜测出来的
# 但是加上以后,guess encoding那一步就会失败
use Encode::Guess qw/utf8 euc-cn gbk/;

#@list = Encode->encodings('Encode::CN');
#foreach(@list){
#    print;
#    print "\n";
#}

# 这里的字符串要够长才会比较准确,我在Encode::Guess的doc里面看到的
$string="出征进行曲阿似的阿阿似的发就哦阿发阿地方就阿阿姐防火墙喔喔去哦去恶气外婆千万千万放进去全家福气氛清华发送到发灰色的阿斯拉夫哈似的发哦发达哈阿发达抵抗力萨回到发思考发达克拉发哈利税分流喀什地方金卡方鸿渐阿叔地方金卡是地方起方法瓦斯大家宋江阿飞>垃圾阿发所发所发似的发所发所发发阿发达地方阿阿发的阿发发达发达发达";

#$string = encode('cp936', decode('utf8', $string));  这个应该不需要,因为这个时候string已经是Perl内部格式了
$string_en = encode('euc-cn',  $string);

print $string_en, ' ', $string, "\n";
$decoder=guess_encoding($string_en, qw/utf8 euc-cn gbk/);
use Data::Dumper;
print Dumper $decoder;

# 你少了这一步,这个是必须的
# 你的那个错误就是因为ref($decoder)是空值,也就是说猜测失败了
ref($decoder) or die "Can not determine\n";
print "I guess it's ", $decoder->name, "\n";

# 我在这里有个问题,及时猜测成功,这里在utf8编码的gnome-terminal下面打印出来的结果依然是乱码
# 真是奇怪,期待大牛出来解答
$info=$decoder->decode($string_en);
print "$info\n";


--
You should be the change you wish to see in the world





--~--~---------~--~----~------------~-------~--~----~
您收到此信息是由于您订阅了 Google 论坛"PerlChina Mongers 讨论组"论坛。
 要在此论坛发帖,请发电子邮件到 perlchina@googlegroups.com
 要退订此论坛,请发邮件至 perlchina+unsubscribe@googlegroups.com
 更多选项,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问该论坛

-~----------~----~----~----~------~----~------~--~---

没有评论: