长度函数假定中文字符不止一个字符。如何在Perl中确定字符串的长度而不依赖于字符编码(将中文字符视为一个字符)?
答案 0 :(得分:8)
length
函数对字符进行操作,而不是八位字节(AKA字节)。字符的定义取决于编码。中文字符仍然是单个字符(如果编码设置正确!)但它们占用的空间超过一个八位字节。因此,Perl中字符串的长度取决于Perl认为该字符串所在的字符编码;唯一与字符编码无关的字符串长度是简单的字节长度。
确保有问题的字符串标记为UTF-8并以UTF-8编码。例如,这会产生3:
$ perl -e 'print length("长")'
然而这产生1:
$ perl -e 'use utf8; print length("长")'
同样如下:
$ perl -e 'use Encode; print length(Encode::decode("utf-8", "长"))'
如果您从文件中获取中文字符,请确保在阅读或写入之前binmode $fh, ':utf8'
该文件;如果您从数据库获取数据,请确保数据库以UTF-8格式返回字符串(或使用Encode
为您执行此操作)。
我不认为你必须拥有UTF-8中的所有内容,你真的只需要确保字符串被标记为具有正确的编码。我可以从头到尾(甚至是横向)使用UTF-8,但因为它是Unicode的通用语言,如果你在任何地方使用它都会让事情变得更容易。
如果您要处理非ASCII数据,可能需要花一些时间阅读perlunicode手册页。