length()的perldoc页面告诉我,我应该使用bytes :: length(EXPR)来查找一个以字节为单位的Unicode字符串,或者
bytes页面回显这个.
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
在我看来,length()和bytes :: length()返回相同的ASCII& Unicode字符串.我的编辑器设置为默认写入UTF-8文件,所以我认为Perl将整个脚本解释为Unicode,这意味着length()会自动处理Unicode字符串吗?
编辑:看我的评论我的问题并没有什么意义,因为在上面的例子中length()不正常工作 – 它显示的是Unicode字符串的长度,以字节为单位,而不是字符.我最初偶然发现的共鸣是对于我需要在HTTP消息中设置Content-Lenth标头(以字节为单位)的程序.我已经阅读了Perl中的Unicode,并期待着做一些让事情变得有效的东西,但是当length()返回完全是我需要的那个蝙蝠的时候,我感到困惑!有关使用utf8,使用字节和Perl中没有字节的概述,请参阅接受的答案.
解决方法
如果您的脚本以UTF-8编码,则请使用
utf8 pragma.另一方面,bytes pragma将强制字节语义的长度,即使字符串为UTF-8.两者都在目前的词汇范围内工作.
$ascii = 'Lorem ipsum dolor sit amet'; { use utf8; $unicode = 'Lørëm ípsüm dölör sît åmét'; } $not_unicode = 'Lørëm ípsüm dölör sît åmét'; no bytes; # default,can be omitted print "Character semantics:\n"; print "ASCII: ",length($ascii),"\n"; print "Unicode: ",length($unicode),"\n"; print "Not-Unicode: ",length($not_unicode),"\n"; print "----\n"; use bytes; print "Byte semantics:\n"; print "ASCII: ","\n";
输出:
Character semantics: ASCII: 26 Unicode: 26 Not-Unicode: 35 ---- Byte semantics: ASCII: 26 Unicode: 35 Not-Unicode: 35