之前需要使用JAVA写一个导出的软件,由用户提供数据库,我这边来解析导出成XML文件,数据库中的编码使用的默认的latin1,数据库中的中文已经是乱码了,使用mysql客户端查询时,通过:
set names latin1
可以正常查询出中文。
但是,在使用JDBC查询出来的结果集,却总是乱码,尝试过各种方法,比如characterEncoding参数等等。但是一直是乱码。在JAVA端使用ISO8859_1解码也无法正常显示出中文,后来经朋友帮忙,在MYSQL官网查询到原来在JAVA中与latin1对应的编码应该是Cp1252,使用Cp1252解码终于可以显示中文了。
之后在查询过程中,又出现问题,还是有一部分中文显示乱码。无法正常显示。编码应该是没有问题了,但是为什么还是显示乱码呢? 又在网上查了很久的资料,才找到问题:
原来Mysql
的latin1 不等于标准的latin1(iso-8859-1) 和cp1252,比iso-8859-1多了0x80-0x9f字符,比cp1252多了0x81,0x8d,0x8f,0x90,0x9d 一共5个字符
。
目前找到两种适合自己的解决方式:
一、通过MYSQL函数进行转换,在MYSQL服务端就转成所需要的UTF-8编码再发送。可以使用:
SELECT convert(unhex(hex(convert(columnName using latin1))) using utf8) as name from table
这样取出来的中文就不会乱码了。
二、通过JDBC结果集的getBytes方法来拿到原始字节码,再通过UTF-8来建立新字符串即可获得正常的中文。
还有一种方式是通过JAVA代码来进行转换,但是由于Cp1252和标准的差异,在对数据进行以下操作后:
new String(getBytes("Cp1252"),"UTF-8")
有部分中文是无法正常显示的。如果哪位有好的方法可以提供一下。