|
2008年11月27日星期四
[PerlChina] 看看我的Facebook个人主页
2008年11月26日星期三
Re: [PerlChina] 如何用正则确定变量的内容是utf8还是gb2312的?
Felix New 写道:
> 有些编码, 在两个函数中都为真的情况.比如:
>
> |> 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?这就不准确了.
>
>
_______________________________________________
China-pm mailing list
China-pm@pm.org
http://mail.pm.org/mailman/listinfo/china-pm
Re: [PerlChina] 如何用正则确定变量的内容是utf8还是gb2312的?
|> 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;
|> }
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
Re: [PerlChina] 如何用正则确定变量的内容是utf8还是gb2312的?
use Encode qw(encode decode);
sub is_utf8{
my $a = shift;
my $b = encode('utf8', decode('utf8', $a));
return ($a eq $b) ? 1 : 0;
}
sub is_gbk{
my $a = shift;
my $b = encode('gbk', decode('gbk', $a));
return ($a eq $b) ? 1 : 0;
}
silent wrote:
了解, 可是我的那两个函数为什么不对呢? 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
Re: [PerlChina] 如何用正则确定变量的内容是utf8还是gb2312的?
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
Re: [PerlChina] 如何用正则确定变量的内容是utf8还是gb2312的?
>
> 看了cu上的帖子:
> http://bbs.chinaunix.net/viewthread.php?tid=907172
>
我们一般使用 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
[PerlChina] 如何用正则确定变量的内容是utf8还是gb2312的?
http://bbs.chinaunix.net/viewthread.php?tid=907172
于是:
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}/);
return 0;
}
sub is_gbk {
my $r = shift;
return 1 if ($$r=~/[\xb0-\xf7][\xa0-\xfe]/);
return 0;
}
可是不准确, 一段文字是utf8或是gb2312的都同时可以被成功匹配
为何?
_______________________________________________
China-pm mailing list
China-pm@pm.org
http://mail.pm.org/mailman/listinfo/china-pm