Perl的length()函数如何计算Unicode字符数?

4

为什么length()函数会显示4个逻辑字符(我本以为只有1个):

$ perl -lwe 'print length("")'
4

我想我的期望有些问题。 :-) 是什么问题呢?


3
关于Perl中的Unicode处理,你想知道的一切都在这里了,但你可能不敢问。 - el.pescado - нет войне
1个回答

11

如果不告诉Perl脚本的源代码是utf8格式,Perl会假定为ASCII格式。这意味着默认情况下,Perl解释器将视为4个单独字符。如果您将单行命令更改为perl -Mutf8 -lwe 'print length("")',则可以看到length函数提供所期望的输出。

utf8编译指示告诉Perl源文件以utf8而不是ASCII格式进行编码。有关更多信息,请参见perldoc utf8


你能分享一下文档在哪里说Perl默认假定为latin1吗? - jreisinger
@jreisinger:在“编码”预处理器指令的文档中,“字节串的隐式升级”部分有注释。也许其他地方有更好的文档资料。 - JGNI
1
@jreisinger,它不假定latin-1。它假定US-ASCII,使非ASCII字节保持不变。由于您提供了字节F0.9F.90.AA,Perl创建了一个等同于"\xF0\x9F\x90\xAA"创建的字符串。使用use utf8;(这是-Mutf8添加的内容),Perl代码使用utf8对源代码进行编码,因此Perl创建了一个等同于"\x{1F42A}"创建的字符串。 - ikegami
证明这不是Latin1编码:perl -MEncode -e'print encode("UTF-8", "sub f\xC9 { }")' | perl -Mutf8 可以运行,但是 perl -MEncode -e'print encode("latin1", "sub f\xC9 { }")' | perl 无法运行。 - ikegami
那是个谎言。没有进行解码。这两个字符串只是简单地连接在一起,没有假设任何语义。编码指示已被弃用(并且比那更长时间被反对),因为它对事物的工作方式或应该工作的方式有一些非常疯狂的想法。 - ikegami
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接