2013-07-11 42 views
1

我爭取超過1天,而Google提出了很多請求來解決這個問題而沒有任何結果。 :(Perl比較2種不同編碼的強調字符串(一種是從UTF8文件讀取的)

其實我有下面的代碼讀取文本文件UTF8編碼的名稱列表,我的perl腳本應該停止時,它會發現一個特定的名稱。這些名稱是法語,並經常有一些口音。也就是說當它開始出現行爲異常:

所以這裏是代碼:

#!/usr/bin/perl 
$ErrorWordFile = "./myFile.txt"; 
open FILEcorpus, $ErrorWordFile or die $!; 

while (<FILEcorpus>) 
{ 
    chomp; 
    $_=~ s/\r|\n//g; 
    $normWord=$_;  
     $string="stéphane"; 

     if($normWord eq $string) 
     { 
      print"\nYES!! does work"; 

     } 
     else 
     { 
      print"\nNO does NOT work"; 
     } 
} 

close(FILEcorpus) 

其實語料庫文件(./myFile.txt)包含「斯特凡\ N」作爲唯一的字符

它顯然來了從UTF8編碼的文件和口音,但顯然並不那麼容易。我試過的東西looot包括

use uft8 

utf8::decode($normWord); without results 

withou任何成功:(

任何想法???

非常感謝您的寶貴幫助!

Simon

+0

請仔細閱讀http://stackoverflow.com/questions/6162484/why-does-modern-perl-avoid-utf-8-by-default/6163129#6163129 – innaM

回答

3

試試這個。

#!/usr/bin/perl 
use strict; 
use warnings; 
use utf8; # This is needed because of the literal "stéphane" in the below code 

my $ErrorWordFile = "./myFile.txt"; 
open my $FILEcorpus, '<:utf8', $ErrorWordFile or die $!; 

while (my $normWord = <$FILEcorpus>) { 
    chomp $normWord; 
    $normWord =~ s/\r|\n//g; 
    my $string = "stéphane"; 

    if ($normWord eq $string) { 
     print "YES!! does work\n"; 
    } 
    else { 
     print "NO does NOT work\n"; 
    } 
} 

close $FILEcorpus; 

你需要告訴Perl你從閱讀該文件是UTF-8,您要比較它的字符串是UTF-8

+3

此外,他可能需要正常化兩個字符串。 'Unicode :: Normalize'會有好處。 – tjd

+1

我也懷疑'使用utf8'會解決你的問題。如果需要進一步調試,請查看字符串的各個代碼點 - 比較@ @p1 = map {ord} split //,$ string'與@ cp2 = map {ord} split //,$ normWord'。 .. – mob

+0

其實我懷疑腳本是用latin1編寫的。否則,如果腳本和數據文件都是utf8,那麼原始腳本應該工作,意外。所以唯一需要的改變可能是'binmode FILEcorpus',':utf8';'。 –

3

您目前正在試圖比較2個字節串這可能不會正常化。

1:use utf8將在程序中從一個字節串改變字符串文字爲Unicode字符串

2:打開該文件爲Unicode與<:utf8,使得輸入理解(解碼)爲Unicode。

3:use Unicode::Normalize將兩個字符串轉換爲相同的標準化格式。

0

你的解釋,實際上是由TJD提供的答案能正常工作,並幫助了我很多非常感謝(因爲我這個問題了漫長的日子已經戰鬥!!)

因此,這裏是修改代碼根據您的意見:

#!/usr/bin/perl 

use utf8; #ADDED 
use Unicode::Normalize; #ADDED 

$ErrorWordFile = "./myFile.txt"; 
open FILEcorpus,'<:utf8',$ErrorWordFile or die $!; #CHANGED 

while (<FILEcorpus>) 
{ 
    chomp; 
    $_=~ s/\r|\n//g; 
    $normWord=$_;  
     $string="stéphane"; 

    $FCD_string = Unicode::Normalize::NFD($string); #ADDED 
    $FCD_normWord = Unicode::Normalize::NFD($normWord); #ADDED 

     if($FCD_normWord eq $FCD_string) 
     { 
      print"\nYES!! does work"; 

     } 
     else 
     { 
      print"\nNO does NOT work"; 
     } 
} 

close(FILEcorpus) 

所以感謝很多!

相關問題