2010-03-07 101 views
4

我有一個SQL轉儲文件由不正確存儲西里爾俄羅斯(WINDOWS-1251)的文本,例如Èðàíñêèå應正常顯示爲Иранские的。如何將存儲爲LATIN1(sql)的西里爾文轉換爲帶有iconv的真正的UTF8西里爾語?

在過去,我已經成功轉換的SQL文件,但在我做了什麼以及以什麼順序內存失敗。

邏輯上它是有道理的,因爲它存儲在LATIN1我會從LATIN1轉換爲WINDOWS-1251,然後從WINDOWS-1251轉換爲UTF-8 // TRANSLIT或類似的東西。

到目前爲止,我已經試過:

iconv -f WINDOWS-1251 -t UTF-8//TRANSLIT -o new.sql snippet.sql 

輸出:

Èðàíñêèå(不是我想要的)

2.

iconv -f LATIN1 -t UTF-8//TRANSLIT -o new.sql snippet.sql 

OUTP UT:

Ã<88>ðàíñêèå(不是我想要的任一)

注意

  • 這是可能的,我可能會轉換一次,然後兩次讓我想要的結果,但我敢確保在最後一步我從WINDOWS-1251轉換爲UTF-8//TRANSLIT,因爲這是在筆記中寫下來的。

  • 另一個需要注意的是,當文件編碼爲utf8(在vim中爲native)時,我在SQL文件中查看Èðàíñêèå。如果我在vim中使用set enc=latin1,那麼我會看到~Hð| íñêèå,好像這並不會讓它更混亂。

回答

5
iconv -f utf-8 -t latin1 < in.sql | iconv -f cp1251 -t utf-8 > out.sql 
+0

真棒 - 謝謝。雖然我不得不用大約40-50左右的UTF8字符替換一個臨時字符串來指示Unicode hexpoint,因爲iconv無法在沒有這些字符的情況下進行處理,但它確實可行。 – 2010-03-07 14:10:00

+3

其實它似乎忘記了在初始iconv中指定'// TRANSLIT',應該這樣做。 – 2010-03-07 14:22:39