热门搜索 :
考研考公
您的当前位置:首页正文

Perl Match with UTF-8

来源:东饰资讯网

Perl Match with UTF-8

尝试使用perl处理中文文档时,发现匹配时总是有BUG。
测试后发现perl似乎判定UTF-8编码的字符长为3。
猜测大概是把汉字拆成ascii后做的匹配。

不过把长度变为三倍后似乎可以运行,即

$lines=~m/^第[一二三四五六七八九十]{6,9}集/

可以匹配

"第二十集","第二十一集" etc

测试后果然发现

print length("第二十集");

Output:
    12

所以说就是编码问题......

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没有自动判断输入文件的编码。
交由编程者判断虽然增加了语言的灵活性,但是我认为这更多的是在浪费编程者的精力......

Top