latin1转gbk的乱码问题,jdbc的bug

博主发现新版mysql驱动在characterEncoding=latin1时会出现乱码,通过研究发现驱动内部强制转码导致。解决方案是使用getBytes方法获取原始字节,或者设置连接参数为characterEncoding=cp1252,但在某些情况下可能引发新的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

阅读更多
有时候json文件,纯文本的文件在nginx或者tomcat上为乱码
可能不像html或者jsp那样可以设置字符编码
注意nginx和tomcat都有utf8的配置
另外要注意
文件也有编码
linux下用vim打开
:set encoding=utf-8
:set fileencoding=utf-8


转http://ssmax.net/archives/1136.html
参考http://www.wcode.net/plus/view.php?aid=246850
Java代码   收藏代码
  1. 由于以前偷懒的原因,很多数据库都是使用latin1作为字符编码,这样可以原样保留数据的字节流,但是最近发现新版的mysql驱动,包括345各版本的最新驱动,用characterEncoding=latin1 参数去访问数据,都会出现问号乱码的问题。  
  2.   
  3. 在网上查了一下,有人说是驱动里面自带强制转换,所以出了问题,根据提示看了一下代码,果然在  
  4.   
  5. ResultSetRow在getString的时候,会使用 SingleByteCharsetConverter 来强制转码,发生了问题。  
  6.   
  7. 网上说要修改驱动,我自己尝试了一下,既然强制转码里面选择了使用cp1252,那这个字符集应该也是单字符全集,所以我直接尝试用该字符集来连接,问题就解决了。。。。  
  8.   
  9. 有两种解决方案:  
  10.   
  11. 1. 使用ResultSet中的getBytes方法,直接获取原始bytes数组,自己按照录入时候的编码new String即可。  
  12.   
  13. 2. 如果用了框架结构,写了必须获取String的,那么连接参数可以写  
  14.   
  15. characterEncoding=cp1252  
  16.   
  17. 程序使用的时候  
  18.   
  19. rs.getString(1).getBytes(“cp1252″)  
  20.   
  21. 即可获取原始字节数组,然后也是按照录入编码进行 new String 即可。  
  22.   
  23. 注意这种方法可能会引起问题,由于cp1252对一些字节的处理并不是我们理解的那样,比如  
  24.   
  25. MySQL translates 0×81 to Unicode 0×00810x8d to 0x008d0x8f to 0x008f0×90 to 0×0090, and 0x9d to 0x009d.  
  26.   
  27. 如果汉字里面刚好有着3中字节的,就会出问题,显示问号。。。  
  28.   
  29. 研究了一下,发了一个bug帖,http://bugs.mysql.com/bug.php?id=64071  
  30.   
  31. 估计也是没人理会的了,呵呵,就当练练英文。  
由于以前偷懒的原因,很多数据库都是使用latin1作为字符编码,这样可以原样保留数据的字节流,但是最近发现新版的mysql驱动,包括345各版本的最新驱动,用characterEncoding=latin1 参数去访问数据,都会出现问号乱码的问题。

在网上查了一下,有人说是驱动里面自带强制转换,所以出了问题,根据提示看了一下代码,果然在

ResultSetRow在getString的时候,会使用 SingleByteCharsetConverter 来强制转码,发生了问题。

网上说要修改驱动,我自己尝试了一下,既然强制转码里面选择了使用cp1252,那这个字符集应该也是单字符全集,所以我直接尝试用该字符集来连接,问题就解决了。。。。

有两种解决方案:

  1. 使用ResultSet中的getBytes方法,直接获取原始bytes数组,自己按照录入时候的编码new String即可。

  2. 如果用了框架结构,写了必须获取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

估计也是没人理会的了,呵呵,就当练练英文。




我的程序:

Java代码   收藏代码
  1. con = (Connection) DriverManager  
  2.                     .getConnection(  
  3.                             “jdbc:mysql://1231231231213:3365/origin_chapters?characterEncoding=cp1252”,  
  4.                             “bookapp_r”“6c0a3ebf4”);  
  5. 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>    
    
评论
1 楼 yvfish 2014-01-27  
今天遇到的问题就是这个原因,cp1252

客户有一个旧数据库是mysql4.0,用的latin1,以前都是在Java中统一转成GBK的
Java代码   收藏代码
  1. 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

————————————————
如果你觉得本人的文章对你有所帮助,客官慢走请赏瓶水喝
微信 支付宝
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值