perl utf8值得注意的一点

 
use utf8;
my $var="测试啊";
 
print "OK1\n" if ($var=~//);
 
printf "str: %s length: %d\n", $var, length($var);
 
$var = `echo $var`;
chomp($var);
 
print "OK2\n" if ($var=~//);
 
printf "str: %s length: %d\n", $var, length($var);

结果:

 
debian:~# ./test.pl 
OK1
Wide character in print at ./test.pl line 11.
str: 测试啊 length: 3
str: 测试啊 length: 9

可以看到输出内容虽然没有变,但是第一次$var是内在utf8的,而第二次内在格式则不是了。

求长度的结果是第一个三个字符,正确,第二次九个字符,说明内存格式占了9个字符(或者叫octet?搞不懂perl的名词了),编码为utf-8。

这就会带来问题,导致regexp匹配不了。

事实上,我遇到的问题并不是通过IPC读来的字符串,而是直接opendir后由readdir得到的中文文件名。这样得到的也像第二次的$var一样,输出正确,但内在格式不对,导致脚本异常。

既然内存格式已经是utf-8编码了,那解决方案自然就是把9个字符变回三个,这是一个解码的过程。对perl不是很熟,但找了一下,还是找到了答案。只消加入一句即可:

 
$var = decode('utf8', $var);

 

此条目发表在开发分类目录。将固定链接加入收藏夹。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

*