jsp乱码问题解答
通常来说,当请求递交到服务器端-->服务器端由servlet获得param-->执行相应的process(包括对数据库的操作)--->返回response显示给用户过程中 如果字符集不同会导致乱码问题。
当 然,编码冲突主要因iso8859等西欧字符集和GBK或big5以及其他一些亚洲字符编码规则不同导致。但对于应用开发人员来说, 死抠编码解码规则没有太大意义,相比较而言,熟悉掌握整个http request/response过程中经过哪些字符/字节转换才会对乱码问题有更进一步的理解。以下是我结合实际问题并查阅相关文档后所总结的一些经 验:
那么为何有时候会出现乱码问题呢?
e.g: 从一个指定为gb2312编码的页面提交到服务器端,而服务器段直接调用request.getParameter()方法拿到字符串s,那么这个字符串 直接返回到response一定会显示为乱码,因为原来的byte[]是gb2312的编码,用iso8859-1解码是一定会出乱码的。把字符串存入数 据库和从数据库中取出字符串概念也是一样,如果数据库字符集是ascii那么rs.getString()拿到的字符串也是按ascii解码的,直接返回 到response为gb2312的页面也会显示乱码.
解决方法通常有以下几种:
在过滤器中过滤所有的request
request.setCharacterEncoding("UTF-8")(需要与客户端浏览器的字符集编码统一)
chain.doFilter(request,response);
这里可以解决服务器段获取参数时编码冲突的问题,过滤后再调用request.getParameter()时在当前环境下就不会产生编码冲突
举 例来说,如果所拿到的字符串s是按iso-8859-1解码的,而想存入字符集为gb2312的数据库那么需要做如下转换String newS = new String(s.getBytes('ISO-8859-1"),"gb2312")以保证拿到gb2312码的字符串,这样就不会出现由于调用数据库 操作而导致的字符集问题。