在网上查了一下,有人说是驱动里面自带强制转换,所以出了问题,根据提示看了一下代码,果然在
ResultSetRow在getString的时候,会使用 SingleByteCharsetConverter 来强制转码,发生了问题。
网上说要修改驱动,我自己尝试了一下,既然强制转码里面选择了使用cp1252,那这个字符集应该也是单字符全集,所以我直接尝试用该字符集来连接,问题就解决了。。。。
有两种解决方案:
-
使用ResultSet中的getBytes方法,直接获取原始bytes数组,自己按照录入时候的编码new String即可。
-
如果用了框架结构,写了必须获取String的,那么连接参数可以写
characterEncoding=cp1252
程序使用的时候
rs.getString(1).getBytes(“cp1252″)
即可获取原始字节数组,然后也是按照录入编码进行 new String 即可。
注意这种方法可能会引起问题,由于cp1252对一些字节的处理并不是我们理解的那样,比如
MySQL translates 0×81 to Unicode 0×0081, 0x8d to 0x008d, 0x8f to 0x008f, 0×90 to 0×0090, and 0x9d to 0x009d.
如果汉字里面刚好有着3中字节的,就会出问题,显示问号。。。
研究了一下,发了一个bug帖,http://bugs.mysql.com/bug.php?id=64071
估计也是没人理会的了,呵呵,就当练练英文。
我的程序:
- con = (Connection) DriverManager
- .getConnection(
- “jdbc:mysql://1231231231213:3365/origin_chapters?characterEncoding=cp1252”,
- “bookapp_r”, “6c0a3ebf4”);
- chapter.setChapter_content(new String(rs.getString(“Content”).getBytes(“cp1252”), “gbk”));
con = (Connection) DriverManager
.getConnection(
“jdbc:mysql://1231231231213:3365/origin_chapters?characterEncoding=cp1252”,
“bookapp_r”, “6c0a3ebf4”);
chapter.setChapter_content(new String(rs.getString(“Content”).getBytes(“cp1252”), “gbk”));
<div id="share_weibo">分享到:
<a data-type="sina" href="javascript:;" title="分享到新浪微博"><img src="/images/sina.jpg"></a>
<a data-type="qq" href="javascript:;" title="分享到腾讯微博"><img src="/images/tec.jpg"></a>
</div>
- 2013-07-04 16:40
- 浏览 3786
- 评论(1)
<li>分类:<a href="https://www.iteye.com/blogs/category/opensource">开源软件</a></li> <li class="last"><a href="https://www.iteye.com/wiki/blog/1899663" target="_blank" class="more">查看更多</a></li> </ul>

客户有一个旧数据库是mysql4.0,用的latin1,以前都是在Java中统一转成GBK的
- new String(String.valueOf(fieldValue).getBytes("latin1"), "GBK");
new String(String.valueOf(fieldValue).getBytes("latin1"), "GBK");
今天客户发现”岠”字会乱码,然后把latin1改成cp1252问题解决。
源码地址:https://wws.lanzous.com/iKKvHn359uf
提供一个乱码恢复网站,挺好用:http://www.mytju.com/classcode/tools/messycoderecover.asp
发表评论
如果你觉得本人的文章对你有所帮助,客官慢走请赏瓶水喝



评论