length()的perldoc
页面告诉我,我应该使用bytes::length(EXPR)
来查找以字节为单位的Unicode字符串,或者bytes页与此相呼应。如何在Perl中查找Unicode字符串的长度?
use bytes;
$ascii = 'Lorem ipsum dolor sit amet';
$unicode = 'Lørëm ípsüm dölör sît åmét';
print "ASCII: " . length($ascii) . "\n";
print "ASCII bytes: " . bytes::length($ascii) . "\n";
print "Unicode: " . length($unicode) . "\n";
print "Unicode bytes: " . bytes::length($unicode) . "\n";
这个脚本的输出,但是,与联机帮助不同意:
ASCII: 26
ASCII bytes: 26
Unicode: 35
Unicode bytes: 35
在我看来,长度()和字节长度::()返回两个ASCII & Unicode字符串相同。默认情况下,我的编辑器设置为将文件编写为UTF-8,所以我认为Perl会将整个脚本解释为Unicode,那么意味着length()会自动正确处理Unicode字符串?
编辑:查看我的评论;我的问题并没有太大意义,因为在上面的例子中,length()是而不是“正常”工作 - 它显示的是Unicode字符串的长度(以字节为单位),而不是字符。我最初偶然发现的这个共振是一个程序,我需要在HTTP消息中设置Content-Lenth标头(以字节为单位)。我已经阅读了Perl中的Unicode,并期望不得不做一些事情来使事情发挥作用,但当length()正好返回我需要的蝙蝠时,我很困惑!在Perl中查看use utf8
,use bytes
和no bytes
的概述。
我不明白你为什么说length()正确处理unicode字符串。在你的例子中,length()给出了与bytes :: length()相同的结果,即字节数,而不是字符数(这是正确的)。 – Inshallah 2009-08-25 07:26:59
换句话说,length($ unicode)将该字符串解释为ASCII,而不是unicode。 – Inshallah 2009-08-25 07:28:41
你绝对正确!我完全忽略了这个事实 - 在我的程序中,我使用length()在HTTP消息中设置Content-Length头,这需要以字节为单位。在阅读length()文档后,我期待该函数返回不正确的东西,但实际上,当Perl处于“use bytes”模式时,它正是我想要的:Unicode字符串的长度(以字节为单位),而不是字符。 – 2009-08-25 15:47:09