2011-10-07 50 views
7

我具有被unix下描述爲一個文件:的iconv unicode的未知的輸入格式

$file xxx.csv 
xxx.csv: UTF-8 Unicode text, with very long lines 

查看它在less/vi將呈現一些特殊字符(SSA°...)不可讀(├╝); Windows也不會顯示它;直接將它導入數據庫只會將特殊字符更改爲其他特殊字符(+ä,+ñ,...)。

我想現在將它轉換爲帶有iconv的「默認可讀」編碼。 當我嘗試它使用UNICODE作爲輸入和UTF-8的iconv

$iconv -f UTF-8 -t ISO-8859-1 xxx.csv > yyy.csv 
iconv: illegal input sequence at position 1234 

轉換爲輸出將返回相同的消息

我猜在文件中另一種格式有所編碼,我不知道如何找出哪種格式,以便將其轉換爲「普遍」可讀的格式...

+0

嘗試在文本編輯器中打開它,使您可以更改打開文件的編碼。瀏覽器最糟糕的情況也會發生。然後玩弄可用的編碼並查看正確顯示字符的內容。 – deceze

+0

我試着用記事本++,但它是680MB和記事本++告訴我這是太大.. –

+0

該文件顯然不是UTF-8,即使'文件'猜測它。你能否以十六進制形式向我們展示從偏移量1234開始的八個字節? –

回答

4

問題是Windows無法將文件解釋爲UTF-8本身。它把它讀成ASCI然後變成2字解釋澶(ASCII 195 164)

試圖將其轉換,我發現我工作的解決方案:

iconv -f UTF-8 -t WINDOWS-1252//TRANSLIT --output=outfile.csv inputfile.csv 

現在我可以查看特殊字符正確編輯

對於SQLServer的保持兼容,轉換UTF-8 UTF-16將工作更好...只是文件大小的增長頗有幾分

1

如果你不知道你打交道的文件類型然後你可以找到它如下,

file file_name 

上面的命令會給你文件格式。然後iconv可以相應地使用。 例如,如果文件格式爲UTF-16並且要將其轉換爲UTF-8則可以使用以下內容。

iconv -f UTF-16 -t UTF-8 file_name >output_file_name 

希望這可以增加洞察你正在尋找的東西。

8

如果您的UTF-8文本只包含可以用ISO-8859-1表示的字符,則只能從UTF-8轉換爲ISO-8859-1。如果不是這種情況,你應該指定這些字符需要發生什麼,或者忽略(// IGNORE)或者近似(// TRANSLIT)它們。請嘗試以下兩種方法之一:

iconv -f UTF-8 -t ISO-8859-1//IGNORE --output=outfile.csv inputfile.csv 
iconv -f UTF-8 -t ISO-8859-1//TRANSLIT --output=outfile.csv inputfile.csv 

在大多數情況下,我估計近似是最好的解決方案,例如映射重音字符到他們沒有出現的對應物,歐元符號到歐元等......