length函数假定中文字符多于一个字符。如何在Perl中独立于字符编码来确定字符串的长度(将中文字符视为一个字符)?
发布于 2011-03-03 14:20:20
length函数对字符进行操作,而不是对八位字节(也称为字节)进行操作。字符的定义取决于编码。中文字符仍然是单字符(如果编码设置正确!)但它们占用的空间不止一个八位位组。因此,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的通用语言,如果你在任何地方都使用它,它会让事情变得更容易。
如果您要处理非perlunicode数据,您可能需要花一些时间阅读ASCII手册页。
https://stackoverflow.com/questions/5177192
复制相似问题