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

    原文作者:Sicuso
    原文地址: https://www.jianshu.com/p/9584a8d0790f
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞