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

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容