比如:
|> sub is_utf8 {
|> my $r = shift;
|> return 1 if ($$r
|> =~/[\x01-\x7f]|[\xc0-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}/);
如果这儿,有个字的编码是[\xf0-\xff][\x80-\xbf]{3},更具体,比如是\xf0\xb1\xb1\xb1,上面红色部分匹配这个编码.那下面的gbk判断函数中的与此同时也匹配这个编码.
|> return 0;
|> }
|> sub is_gbk {
|> my $r = shift;
|> return 1 if ($$r=~/[\xb0-\xf7][\xa0-\xfe]/);
\xf0\xb1\xb1\xb1,上行的正则也匹配这个编码中的部分.
|> return 0;
|> }
|> sub is_utf8 {
|> my $r = shift;
|> return 1 if ($$r
|> =~/[\x01-\x7f]|[\xc0-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}/);
如果这儿,有个字的编码是[\xf0-\xff][\x80-\xbf]{3},更具体,比如是\xf0\xb1\xb1\xb1,上面红色部分匹配这个编码.那下面的gbk判断函数中的与此同时也匹配这个编码.
|> return 0;
|> }
|> sub is_gbk {
|> my $r = shift;
|> return 1 if ($$r=~/[\xb0-\xf7][\xa0-\xfe]/);
\xf0\xb1\xb1\xb1,上行的正则也匹配这个编码中的部分.
|> return 0;
|> }
那,最后\xf0\xb1\xb1\xb1这个编码是gbk还是utf8?这就不准确了.
2008/11/27 silent <silent2600@gmail.com>
>
> 了解, 可是我的那两个函数为什么不对呢?
>
> agentzh 写道:
> >
> > 我们一般使用 CPAN 上的 Encode::Guess 模块。对于长文本非常有效的,但是对于非常短的,比如两三个字的文本就不怎么准了,呵呵。
> >
> > use Encode::Guess;
> > my @enc = qw( UTF-8 GB2312 Big5 GBK Latin1 );
> > for my $enc (@enc) {
> > my $decoder = guess_encoding($data, $enc);
> > if (ref $decoder) {
> > $charset = $decoder->name;
> > last;
> > }
> > }
> > if (!$charset) {
> > die "Can't determine the charset of the input.\n";
> > }
> >
> > 这里 @enc 中是尝试的 charset 数量。其实感觉用 Encode 的 decode
> > 函数也可以直接整,只不过设一个参数让它遇到错误字节时直接抛异常即可 ;)
> >
> > -agentzh
> >
>
> _______________________________________________
> China-pm mailing list
> China-pm@pm.org
> http://mail.pm.org/mailman/listinfo/china-pm
--
Best regards.
Felix New
2008/11/27 silent <silent2600@gmail.com>
>
> 了解, 可是我的那两个函数为什么不对呢?
>
> agentzh 写道:
> >
> > 我们一般使用 CPAN 上的 Encode::Guess 模块。对于长文本非常有效的,但是对于非常短的,比如两三个字的文本就不怎么准了,呵呵。
> >
> > use Encode::Guess;
> > my @enc = qw( UTF-8 GB2312 Big5 GBK Latin1 );
> > for my $enc (@enc) {
> > my $decoder = guess_encoding($data, $enc);
> > if (ref $decoder) {
> > $charset = $decoder->name;
> > last;
> > }
> > }
> > if (!$charset) {
> > die "Can't determine the charset of the input.\n";
> > }
> >
> > 这里 @enc 中是尝试的 charset 数量。其实感觉用 Encode 的 decode
> > 函数也可以直接整,只不过设一个参数让它遇到错误字节时直接抛异常即可 ;)
> >
> > -agentzh
> >
>
> _______________________________________________
> China-pm mailing list
> China-pm@pm.org
> http://mail.pm.org/mailman/listinfo/china-pm
--
Best regards.
Felix New
没有评论:
发表评论