Perl Match with UTF-8
起
尝试使用perl处理中文文档时,发现匹配时总是有BUG。
测试后发现perl似乎判定UTF-8编码的字符长为3。
猜测大概是把汉字拆成ascii
后做的匹配。
不过把长度变为三倍后似乎可以运行,即
$lines=~m/^第[一二三四五六七八九十]{6,9}集/
可以匹配
"第二十集","第二十一集" etc
测试后果然发现
print length("第二十集");
Output:
12
所以说就是编码问题……
承
于是依照utf8 – perldoc.perl.org
增加了
use utf-8;
Do not use this pragma for anything else than telling Perl that your script is written in UTF-8.
测试后果然发现
print length("第二十集");
Output:
4
但是测试输入发现长度依然不对,说明程序读入文件时无法确定输入的类型是否是UTF-8
转
于是在读文件改为
open(instream, $file) or die ("Could not open file"); # Open the file
binmode instream, ':encoding(UTF-8)';
但是发现报错
Wide character in print
说明输出时没有指定编码为UTF-8
。
加上
binmode STDOUT, ':encoding(UTF-8)';
后搞定。
合
结论是似乎Perl
没有自动判断输入文件的编码。
交由编程者判断虽然增加了语言的灵活性,但是我认为这更多的是在浪费编程者的精力……