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,否则会删除错误。