如何将存储为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
真棒 - 谢谢。虽然我不得不用大约40-50左右的UTF8字符替换一个临时字符串来指示Unicode hexpoint,因为iconv无法在没有这些字符的情况下进行处理,但它确实可行。 – 2010-03-07 14:10:00
其实它似乎忘记了在初始iconv中指定'// TRANSLIT',应该这样做。 – 2010-03-07 14:22:39