2009/1/22 agentzh <[email protected]>

> 2009/1/22 agentzh <[email protected]>
>
>> 以字符语义编历串,如果是 ascii 则按 1 计算之(有专门的正则 group),否则算 2 不就结了?
>>
>
> For the record:
>
> $ perl -MEncode -e 'for (split //, Encode::decode "utf8",shift) { if
> (/[[:ascii:]]/) { $c++ } else { $c+=2 } }print $c' '你b好'
> 5
>

把 Perl 的 one-liner 写得这么长,确实挺丢脸的:

    $ perl -MEncode -e '$_=shift;Encode::_utf8_on($_);while (/[[:ascii:]]/g)
{ $a++ }print $a+2*(length($_)-$a)' '你b好'
    5

这个效率应该会高不少,特别是大串。

呃。。。还可以更短一些:

    $ perl -MEncode -e
'$_=shift;Encode::_utf8_on($_);s/[[:ascii:]]/$a++/eg;print
$a+2*(length($_)-$a)' '你b好'
    5

不过这种形式未必更快。。。Benchmark welcome!

还可以更短一些!

    $ perl -MEncode -e '$_=shift;Encode::from_to($_,"utf8","gbk");print
length $_' '你b好'
    5

这种形式应该是最快的。。。呵呵。。。借用 GBK 中非 ASCII 都是 2 个字节的特点。。。

呃。。。如果要写成函数的话,可以这么写(以最短的那个 one-liner为例):

use Encode qw( from_to );

sub visual_length ($) {
    my $s = shift;
    from_to($s, 'utf8', 'gbk');
    length $s;
}

print visual_length "你b好";

Cheers,
-agentzh

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

回复