如何将存储为LATIN1(sql)的西里尔文转换为带有iconv的真正的UTF8西里尔语?

问题描述:

我有一个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ð| íñêèå,好像这并不会让它更混乱。

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