JSP向MYSQL读写中文乱码问题解决方案

中文乱码.这个是最头疼的事情.我用的是数据库连接池,在db.propertise里面的URL设置字符集是utf-8,在JSP页面里如果写入中文到数据库是乱码,直接在数据库里写入中文再读出来也是乱码,于是用new String(words.getBytes("ISO-8859-1"),"GB2312");对从数据库里读出来的中文转码,终于出来可爱的汉字了,但是写入就是比较麻烦,,因为每个人的数据库设置的字符集并不一样.最后我在写入中文的时候用了words.getBytes("ISO-8859-1"),在web.xml里的filter设置字符集为ISO-8859-1





jsp乱码问题解答

通常来说,当请求递交到服务器端-->服务器端由servlet获得param-->执行相应的process(包括对数据库的操作)--->返回response显示给用户过程中 如果字符集不同会导致乱码问题。

当 然,编码冲突主要因iso8859等西欧字符集和GBK或big5以及其他一些亚洲字符编码规则不同导致。但对于应用开发人员来说, 死抠编码解码规则没有太大意义,相比较而言,熟悉掌握整个http request/response过程中经过哪些字符/字节转换才会对乱码问题有更进一步的理解。以下是我结合实际问题并查阅相关文档后所总结的一些经 验:

    • 客户端通过表单提交的请求(参数)。这里的参数编码规则是由定义在html或jsp页面头部directives决定的,如果没有特别指定则默认为iso-8859-1
    • 服 务器端接受请求,在某servlet中(jsp归结到底也是servlet)获得请求参数并进行相应逻辑操作。最常用的是 request.getParameter(); 方法。 如果不加任何指定,这一方法其实完成了如下的几个工作 a.从请求报文中拿到参数的byte[] b.按照默认编码规则解码(iso-8859-1)得到一个String字符串
    • 可能进行对数据库的操作,(增删改查),这里要注意同数据库的字符集统一,各数据库察看字符集的方法不同,一般都是通过查看数据字典获得
    • 返回response给用户, 客户浏览器根据response的contentType属性制定的charset来显示response
那么为何有时候会出现乱码问题呢?

e.g: 从一个指定为gb2312编码的页面提交到服务器端,而服务器段直接调用request.getParameter()方法拿到字符串s,那么这个字符串 直接返回到response一定会显示为乱码,因为原来的byte[]是gb2312的编码,用iso8859-1解码是一定会出乱码的。把字符串存入数 据库和从数据库中取出字符串概念也是一样,如果数据库字符集是ascii那么rs.getString()拿到的字符串也是按ascii解码的,直接返回 到response为gb2312的页面也会显示乱码.

解决方法通常有以下几种:
    • 统一所有的字符集编码,推荐(utf-8),可创建全局过滤器
      在过滤器中过滤所有的request
      request.setCharacterEncoding("UTF-8")(需要与客户端浏览器的字符集编码统一)
      chain.doFilter(request,response);
      这里可以解决服务器段获取参数时编码冲突的问题,过滤后再调用request.getParameter()时在当前环境下就不会产生编码冲突
    • 可修改相应服务器配置目录下的server.xml,以Tomcat为例: URIENcoding 设成UTF-8,原理同1
    • 结合使用new String(byte[] byte, String charset) 和byte[] String.getBytes(String charset)方法。但要注意前者是解码(从字节流得到字符串)后者是编码(将字符串重新编码为字节流)
      举 例来说,如果所拿到的字符串s是按iso-8859-1解码的,而想存入字符集为gb2312的数据库那么需要做如下转换String newS = new String(s.getBytes('ISO-8859-1"),"gb2312")以保证拿到gb2312码的字符串,这样就不会出现由于调用数据库 操作而导致的字符集问题。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值