我有一個文件有一個短語/術語每一行,我從STDIN讀取perl。我有一個停用詞表(如「á」,「são」,「é」),我想比較每個詞與每個詞,並刪除它們是否相等。問題是我不確定該文件的編碼格式。Perl - 文件編碼和字比較
我得到這個從file
命令:
words.txt: Non-ISO extended-ASCII English text
我的Linux終端是UTF-8,它顯示了一些單詞正確的內容和別人不一樣。下面是其中一些輸出:
condi<E3>
conte<FA>dos
ajuda, mas não resolve
mo<E7>ambique
pedagógico são fenómenos
你可以看到,第3和第5行正確識別單詞,重音和特殊字符,而有的則沒有。其他線路的正確輸出應該是:condiã,conteúdos和莫桑比克。
如果我使用binmode(STDOUT, utf8)
,「錯誤」行現在可以正確輸出,而其他的不行。例如,第三行:
阿茹達,MAS NA£Ø決心
我應該怎麼辦的傢伙?
@邁克爾由於現在它的輸出正確;) 我意識到,大多數的文件是ISO-8859-1和UTF-8某些部分(這就是爲什麼有些人被正確輸出) 一個更事情。我不得不使用'lc'函數,因爲我的停用詞都是較低的,而且當短語不是utf-8時,我遇到了問題。在這種情況下,如果我有一個重音字母的大寫字母,它不會低下。 – Barata 2011-05-05 18:58:56
@Barata:如果你想'uc'等工作,你仍然需要解碼非UTF8字符串。 Perl 5.12(及以上版本)'unicode_strings'特性也可能有所幫助,因爲它將假定字節串爲ISO 8859-1。比較:'perl -e'print uc(「\ xB5 \ xE9 \ xDF」)''=> 'μéß',**這是錯誤的,**與 'perl -M5.012 -e'print uc 「\ xB5 \ xE9 \ xDF」)''=>'ΜÉSS'**這是正確的。**最後一個字符串實際上是'\ x {39C} \ x {C9} SS「'或'」\ N {希臘大寫字母小寫} \ N {拉丁文大寫字母E} AC。原始字符串是'\ N {MICRO SIGN} \ N {LATIN小字母E WITH ACUTE} \ N {拉丁小寫字母夏普S}「。 – tchrist 2011-05-05 19:09:11
@tchrist使用Michael代碼,檢查'if $ @'並將字符串解碼爲iso-8859-1就足夠了? – Barata 2011-05-05 19:18:32