2013-06-23 57 views
1

我知道這個問題已經被問過。我確實檢查了以前的所有答案,但仍無法解決我的問題。請原諒我顯然重複的問題。在Perl中匹配中文字符

我正在寫一個perl程序來處理中文文本文件。我想識別中文文本,但排除其他所有行,如英語或其他語言和網址。我使用「use utf8」和「$line =~ /(\p{Han}+)/」,但它什麼也沒做。如果我使用「use utf8」和「$line =~ /信息/」,它什麼也不做。如果我不使用「use utf8」,「$line =~ /信息/」可以使用,但不使用「$line =~ /(\p{Han}+)/」。我使用file -bi input.txt檢查文本文件編碼,它顯示:「text/plain; charset=utf-8」。以下是代碼:

$|=1; 
use strict; 
use utf8; 

my $in = $ARGV[0]; 

sub main { 

    open(IN, "$in") or die "can't open $in\n"; 

    while (my $line=<IN>) { 
     chomp($line); 

     if ($line =~ /(\p{Han}+)/) { 
     print "chinese: $line\n"; 
     } 

     if ($line =~ /信息/) { 
      print "$line\n"; 
     } 

    } # end while 

    close(IN); 
} 

非常感謝您的幫助和建議!

/(\p{Han}+)/u 

回答

7

您需要打開該文件爲UTF-8:

open IN, "<:encoding(UTF-8)", $in or die "can't open $in\n"; 

+0

這實際上確實產生正確的輸出,但是,有很多像這樣的線路:在test.pl第13行打印 寬字符,線4 – querystack

+1

通過增加固定它: binmode STDOUT,「:UTF8」; 非常感謝!整個事情現在起作用! – querystack

-3

,如果你想的是,正則表達式引擎將您的字符串作爲Unicode字符串必須使用u修飾符否則它被讀作字節字符串,這不是你想要的。

+0

感謝您的及時回覆。我嘗試過,但它仍然沒有任何作用。 – querystack

+1

請參閱[perlre](http://perldoc.perl.org/perlre.html#Character-set-modifiers)。如果正則表達式或字符串採用utf8格式,或者模式提到unicode特性('\ p','\ N'',高碼點),則選擇unicode語義。 '/ u'對於明確這一點很有用,但不會改變* this *的任何內容。 charset修飾符可以用來指示'\ w','\ d'和'/ i'修飾符應該如何工作(還有:相關的字符和連字符)。 – amon