2012-03-27 49 views
1

我正在閱讀一個文本文件,我猜是用UTF-8編碼的。儘管如此,一些行只能被解碼爲拉丁-1。我會說這是非常糟糕的做法,但我必須應付它。使用多種編碼的文件

我有以下問題:

第一:我怎麼能「猜測」文件的編碼?我曾嘗試enca,但在我的機器:

enca --list languages 
belarussian: CP1251 IBM866 ISO-8859-5 KOI8-UNI maccyr IBM855 KOI8-U 
    bulgarian: CP1251 ISO-8859-5 IBM855 maccyr ECMA-113 
     czech: ISO-8859-2 CP1250 IBM852 KEYBCS2 macce KOI-8_CS_2 CORK 
    estonian: ISO-8859-4 CP1257 IBM775 ISO-8859-13 macce baltic 
    croatian: CP1250 ISO-8859-2 IBM852 macce CORK 
    hungarian: ISO-8859-2 CP1250 IBM852 macce CORK 
lithuanian: CP1257 ISO-8859-4 IBM775 ISO-8859-13 macce baltic 
    latvian: CP1257 ISO-8859-4 IBM775 ISO-8859-13 macce baltic 
    polish: ISO-8859-2 CP1250 IBM852 macce ISO-8859-13 ISO-8859-16 baltic CORK 
    russian: KOI8-R CP1251 ISO-8859-5 IBM866 maccyr 
    slovak: CP1250 ISO-8859-2 IBM852 KEYBCS2 macce KOI-8_CS_2 CORK 
    slovene: ISO-8859-2 CP1250 IBM852 macce CORK 
    ukrainian: CP1251 IBM855 ISO-8859-5 CP1125 KOI8-U maccyr 
    chinese: GBK BIG5 HZ 
     none: 

這是不夠的,檢測Latin-1的。順便說一下:如何增加enca的可用語言列表?

第二:是否有可能使用不同的編碼部分編碼文件?我認爲,從技術角度來看,這是非常可能的:僅僅爲文件的不同部分使用不同的編解碼器。你見過這個嗎?你將如何處理閱讀這樣的文件?你會嘗試用不同的編碼解碼每一行嗎?你會怎麼做呢?我實際上使用python,並且將會理解處理多重編碼的一個例子。

第三:你通常如何處理你不知道他們正在使用的編碼的文件?我經常在從不同來源下載文本文件時遇到此問題。它們通常是從電子表格導出的CSV文件(我猜是excel),但根據導出參數,它們使用一種編碼或另一種編碼,而沒有提示選擇哪一種,所以我不得不猜測。

回答

2
  1. 猜猜文本編碼文件 - 在什麼? Python,Perl,Java,C?請注意,這有時會產生意想不到的結果(例如the "bush hid the facts" bug
  2. 有時,文件將以不同的編碼編碼文本。文件格式可以爲文件中的不同部分指定不同的編碼,或者格式允許指定編碼開關。例如,在MIME中,標題鍵是ascii,標題值可以具有以其他編碼編碼的嵌入部分,並且在Content-Type標題中聲明內容的編碼。
  3. 如果你不知道編碼,你只需要從文件中讀取字節(以二進制安全的方式)到緩衝區,直到你可以確定編碼。
+0

你如何確定二進制緩衝區的編碼? – dangonfast 2012-03-27 09:49:26

+0

啓發式,猜測和統計分析。通常你會使用一個庫或一個幫手程序。因此第一個問題是:你使用的是什麼技術? – Joni 2012-03-27 14:58:03

+0

我正在使用python,但發現文件中使用的編碼的任何*方法都會執行。 – dangonfast 2012-03-28 07:56:14

0

當你說「用不同的編碼部分編碼」時,你確定它不只是UTF-8嗎? UTF-8根據字符的複雜性混合單字節,雙字節和多字節編碼,因此它的一部分看起來像ASCII/latin-1,其一部分看起來像Unicode。

http://www.joelonsoftware.com/articles/Unicode.html

編輯:於猜測下載的純文本文件的編碼,我通常是在Chrome或Firefox打開它們。他們支持大量的編碼,並且非常擅長選擇正確的編碼。然後,可以從那裏將內容複製到Unicode編碼的文件中。

+0

好,告訴你真相, 我不確定。我知道我在解碼時遇到了utf-8和latin-1的問題,在文件的*不同部分。我想要的是一種獲取文件編碼的萬無一失的方法。而且,如果文件具有多種編碼,我也想知道這一點。也許這不可能,但我只是不知道。 – dangonfast 2012-03-27 14:47:37