FWNews: Perl中UTF-8环境及正则表达式RegExp的使用

FWNews是Forward News的意思,我们在跟进一个新闻转载发现系统(-people-fwnews)的项目。其中有服务使用Perl来实现,Perl的i18n的工作做得不错,要在Perl中实现完整的utf-8的读入和utf-8的写出,需要在Perl程序的头部引入use:

user utf8;
use open ‘:std’, ‘:encoding(UTF-8)’;
binmode STDOUT, ‘encoding(UTF-8)’;

通常情况下在Perl中使用正则表达式RegExp并没有差异,比如在一行中匹配, ufqi.com 这个字串,写法是:

if($line=~/ufqi\.com/i){
print “Matched.\n”;
}
else{
print “Not-Matched.\n”;
}
如果不指定使用UTF-8或者Unicode,默认会使用单字节的ISO编码,比如我们要在一行中匹配“稿件来源:”这样的字符:

if($line=~/稿件来源:/i){…..}

如果不指定UTF-8环境的话,下面这样的写法也会匹配到
“大麻来源:”

而下面的写法就不会匹配到:
“大兴来源:”

这种不可靠的匹配,源于如果不明确写出使用UTF-8环境,Perl默认会逐个字节的匹配,
“稿件”的编码是 0xE7 A8 BF E4 BB B6
“大麻”的编码是 0xE5 A4 A7 E9 BA BB
“大兴”的编码是 0xE5 A4 A7 E5 85 B4

从中,我们发现,“稿件”和“大麻”能够使用同一个正则表达式,是因为两者都有字节 0xBB .

This entry was posted in 编程技术, 计算机技术 and tagged , , , . Bookmark the permalink.

发表评论

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