在从oracle数据库中读取数据时出现乱码,但是通过pl/sql developer查询正常。具体情况如下:jsp,页面编码:gb2312oracle编码:us7ascii使用过滤器进行编码转换,request.setCharacterEncoding(gb2312),能够使传参时编码转换成中文,但是从数据库中读来的中文却显示为乱码。如果不使用过滤器,且去掉jsp页面中page指令的charset=gb2312这句话,中文却能正常显示,很是疑惑。现在我使用的办法每次把从数据库中取来的数据进行String(s.getBytes("ISO8859-1"), "gb2312")转换,但是这样做很麻烦,想着能不能编写个过滤器之类,把每次从数据库取来的数据进行编码转换?
编码问题是很多人都困惑的,这里我来说下自己对编码的认知。首先出现乱码大家都知道是中文字符转换的原因,那么到底哪些地方需要设置编码这就是需要探究的问题。楼主用的是java web,所以总结有以下几点:第一。jsp页面。。jsp页面有三个可以设置编码的地方,而我们一目了然能看到的有2处,分别是头部声明里的charset=UTF-8和pageEncoding="UTF-8" 这里编码我暂时用utf-8。还有一个就是request.setCharacterEncoding(“UTF-8”),要知道它们都代表什么就必须先了解jsp到底是怎么运行的。我们将配置好的的项目运行(只有一个index.jsp的jsp文件),我的server.xml设置的虚拟目录是path=“”。然后我们到这个目录下tomcat6.0\work\Catalina\localhost\_\org\apache\jsp找到一个index_jsp.java的文件。点开查看,我们会惊奇的发现这个竟然是一个servlet类而他处理的东西正是我们的index.jsp 也就是说容器执行jsp实际是把jsp先翻译成了一个servlet再让服务器执行的。知道这个我们不难猜出reques.setCharacterEncoding("utf-8")肯定是和servlet里一样的get请求的编码,也就是提交参数时需要的。而在翻译的java文件里找到这句话response.setContentType("text/html; charset=UTF-8"),原来charset就是设置我们的服务器响应编码。那么最后个pageEncoding是什么呢。他其实就是jsp翻译为servlet时用到的翻译编码! 知道了jsp的编码后我们来探讨其他哪些地方还需要设置,刚刚我们知道了jsp的servlet是需要设置编码的,那么同样的道理,我们自己的servlet当然也需要,所以在操作servlet的时候最好加上response和request的编码设置,一般我们为了简便把它统一的设置在过滤器里,让过滤器拦截所有请求从而达到设置编码的目的。这个搞定后剩下的就是数据库的编码了,我们安装数据库的时候都会有设置默认编码的界面吧,这说明数据库也是需要编码的,这个就不具体阐述了,设置的地方自己查看!最后的问题,如果我们收到的数据是已经被编码的数据怎么办,这时候就需要String(s.getBytes("ISO8859-1"), "utf-8")进行string的先编码再转码,这个可以同样的我们用过滤器统一过滤。这里最后建议大家最好使用统一的编码,utf-8是个比较好的选择,如果在各个地方都设置好,乱码问题就不会存在了