中文乱码.这个是最头疼的事情.我用的是数据库连接池,在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
e.g: 从一个指定为gb2312编码的页面提交到服务器端,而服务器段直接调用request.getParameter()方法拿到字符串s,那么这个字符串 直接返回到response一定会显示为乱码,因为原来的byte[]是gb2312的编码,用iso8859-1解码是一定会出乱码的。把字符串存入数 据库和从数据库中取出字符串概念也是一样,如果数据库字符集是ascii那么rs.getString()拿到的字符串也是按ascii解码的,直接返回 到response为gb2312的页面也会显示乱码.
解决方法通常有以下几种:
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码的字符串,这样就不会出现由于调用数据库 操作而导致的字符集问题。
- 统一所有的字符集编码,推荐(utf-8),可创建全局过滤器