2008年11月27日星期四

[PerlChina] 看看我的Facebook个人主页

facebook

看看我的Facebook个人主页


您好,china-pm

我设置了我的Facebook个人主页,在这里,我可以上传照片、视频和活动。我想把您加为朋友,这样您就可以看到它们了。但是首先,您必须加入Facebook!加入后,您也可以创建自己的个人主页。

谢谢!
Wan

注册Facebook,请访问下面的链接:
http://www.facebook.com/p.php?i=1071245674&k=XXFU23Q336XMZEFGRF6YV&r

看看还有谁邀请您加入Facebook:
Mike GuoMike Guo
17 个朋友
这封电子邮件可能包含促销信息。如果您不希望继续收到Facebook发送的商业邮件,请点击选择退出。Facebook办事处地址:156 University Ave., Palo Alto, CA 94301 。

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;
|> }

那,最后\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

Re: [PerlChina] 如何用正则确定变量的内容是utf8还是gb2312的?

try this?

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的?

2008/11/27 silent <silent2600@gmail.com>
>
> 看了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的?

看了cu上的帖子:
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