【发布时间】:2010-11-22 12:42:37
【问题描述】:
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() not 工作“正常” - 它以字节而不是字符显示 Unicode 字符串的长度。我最初偶然发现的原因是我需要在 HTTP 消息中设置 Content-Lenth 标头(以字节为单位)的程序。我已经阅读了 Perl 中的 Unicode,并期望必须做一些花哨的事情才能使事情正常进行,但是当 length() 准确地返回了我需要的东西时,我很困惑!有关 Perl 中 use utf8、use bytes 和 no bytes 的概述,请参阅已接受的答案。
【问题讨论】:
-
我不明白你为什么说 length() 可以正确处理 unicode 字符串。在您的示例中,length() 给出与 bytes::length() 相同的结果,即字节数,而不是字符数(这是正确的)。
-
换句话说,length($unicode) 将字符串解释为 ASCII,而不是 unicode。
-
你说的完全正确!我完全忽略了这个事实——在我的程序中,我使用 length() 来设置 HTTP 消息中的 Content-Length 标头,该标头需要以字节为单位。在阅读了 length() 文档后,我期待该函数返回一些不正确的东西,但实际上当 Perl 处于
use bytes模式时,这正是我想要的:Unicode 字符串的长度,以字节为单位,而不是字符。 -
为什么要一个 Unicode 字符串的长度?你用它做什么?