转换MySQL数据库备份后出现的乱码

ERI book library有一个简单的基于Web的图书借阅管理系统,使用MySQL数据库。这个应用是用JSP+Servlet编写的,插入数据记录时使用的是GB18030编码。不过不久之前,服务器曾经做了一次迁移,之后网页显示的就变为了奇怪的乱码,既非GB、HZ等编码,也不是UTF-X编码。

后来和同事仔细分析了一下,可能当时用mysqldump备份数据库时,用的是C locale,而mysql把双字节的GBK字符(例如“你”,0xc4e3),拆成两个UCS2(0x00c4, 0x00e3),然后转成UTF-8(0xc384 0xc3a3)。最后我们看到的就是Äã。

要做反向的转换,可以如下操作:

    LC_ALL=C iconv -f UTF-8 -t UCS-2BE | tr -d ''(输出为GBK编码)

注意要在C locale下运行tr,否则会删除错误。