LC_CTYPE=en_US.UTF-8下Perl length('für')返回4的问题解决
Perl
length函数计算含变音符号字符串长度异常的原因及解决 问题本质
你遇到的问题是Perl将UTF-8编码的字节串当作原始字节处理,而非识别为Unicode字符:
- "für"的UTF-8编码为4字节:
66 c3 bc 72(对应3个Unicode字符:f、ü、r) - 当字符串以字节串形式存在时,
length返回的是字节数4,substr也按字节截取,导致乱码输出
为什么use utf8无效?
use utf8仅用于声明源代码文件本身是UTF-8编码,它会正确解析源代码中的UTF-8字面量,但无法自动将外部输入或已生成的字节串转换为Unicode字符串。如果你的"für"不是直接写在源代码里的字面量,use utf8起不到作用。
解决方式
明确将字节串解码为UTF-8格式的Unicode字符串即可:
use Encode qw(decode); my $unicode_str = decode('utf8', 'für'); print length $unicode_str; # 输出3
如果是从文件/标准输入读取字符串,建议直接在打开时指定编码,避免后续手动解码:
open(my $fh, '<:encoding(utf8)', 'input.txt') or die $!; my $str = <$fh>; print length $str; # 正确返回字符数
额外说明
Perl的自动Unicode升级需要明确的编码上下文。只有当字符串被标记为UTF-8(或其他Unicode编码)时,length才会返回字符数。你的Perl 5.18版本完全支持Unicode特性,但仍需显式处理编码转换,尤其是处理外部数据时。
内容的提问来源于stack exchange,提问作者U. Windl
相关产品推荐
相关产品推荐

