jsp中文编码乱码的分析与解决
摘 要 jsp技术目前普遍应用于网络编程,java在中文处理方面经常出现乱码现象。本文从分析各种常见的jsp页面中文乱码产生的原因入手,并给出该乱码的解决方案。经过多次实践,基本可以解决常见jsp页面常见的中文乱码问题,有着很好的广泛性。
关键词 网络编程;中文乱码;jsp页面编码
0引言
JSP(Java Server Pages)是由Sun公司倡导、许多公司参与一起建立的一种动态网页技术标准,jsp技术采用java作为开发脚本语言,java本身有着很好的跨平台性,但是jsp在结合页面技术后,最使人头疼的一个问题就是不能很好的处理中文乱码问题,在开发过程中带来诸多不便,本文从剖析中文乱码产生的各种原因入手,并给出相应的解决方案。
1中文乱码的根源
1)中文的编码很多,在不同的情况下可能有多种不同的二进制值;
2)在某些应用中传递数据时,可能把中文转换成其它形式;
3)在一个应用系统中,编码之间存在各种各样的转换;
4)在转换过程中需要制定编码方式;
5)在具体实践过程中,可能忽略或忘记设置编码;
6)不同的软件环境其编码设置方式不同也容易导致中文乱码;
7)编码工具的多样性以及对编码的模糊认识不清。
2常见的jsp页面中文乱码
网上常出现的 JSP/Servlet encoding 问题一般都表现在 browser 或应用程序端,如:
浏览器中看到的 Jsp/Servlet 页面中的汉字怎么都成了‘?’;浏览器中看到的 Servlet 页面中的汉字怎么都成了乱码;JAVA 应用程序界面中的汉字怎么都成了方块;Jsp/Servlet 页面无法显示 GBK 汉字;Jsp/Servlet 不能接收 form 提交的汉字;JSP/Servlet 数据库读写无法获得正确的内容。
3 中文乱码产生原因分析
1)在jsp中如果指定了,那么在该jsp中所有用到的数据,如果沒有指定编码,那么这些数据的编码方式为A。
从request得到的数据如果没有指定request的编码的话,默认编码为iso-8859-1。
假设从别的地方得到的数据是使用原来初始的编码的,比如从数据库得到数据,如果数据库的编码是B,那么该数据的编码是B而不是A,也不是系统默认的,此时,如果要输出的数据的编码不是A,那么,很可能显示乱码,所以首先要将数据正确转化为编码A,然后再输出;
2)在jsp中如果没有指定,那么默认的A编码为iso-8859-1;
3)Servlet中如果执行了像 response.setContentType(“text/html;charset=A”),说明将response的字符输出流编码设置为A,所有要输出的数据的编码要转化为A,否則就会出现乱码。Servlet中从request得到的数据的编码和jsp中一样的,但是在servlet java文件中构造的数据是使用是系统默认的编码(iso-8859-1);servlet中从外部得到的数据使用的是原来的编码,比如从编码为B的数据库得到的数据是编码为B,不是A,也不是系统默认的编码。
4中文乱码解决方案
4.1 JSP页面显示为乱码
如果只在页面中加入,该处指定的编码仅为浏览器对字符的显示处理,但是服务器的编码方式和浏览器的编码方式对字符的单独处理,所以还要在页面的第一行加上:
,就可以消除乱码了。
4.2 Servlet接收Form/Request传递的参数时显示为乱码
方法1:在使用request获取参数前,加上此语句:request.setCharacterEncoding(“A”),此处设置的编码要和传递参数的页面采用的编码方式一致。
方法2:使用过滤器(filter),在doFilter方法中做如下处理:
package com.knorray.filters;
public class CharEncodingFilter implements Filter{
protected String encoding = null;
public void init(FilterConfig filterConfig) throws ServletException {
this.encoding = filterConfig.getInitParameter(“encoding”); }
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain){
if ( request.getCharacterEncoding() == null) {
String encoding = this.encoding;
if(encoding != null) request.setCharacterEncoding(encoding);
chain.doFilter(request, response); } }
}同时,在web.xml中配置该过滤器:
CharEncodingFilter
com.knorray.filters. CharEncodingFilter
encoding gb2312
SetCharacterEncoding
/*
4.3 JSP接收Form/Request传递的参数时显示为乱码
servlet可以处理中文后,jsp页面接收Form/Request传递的参数却仍然显示为乱码。
如果你的表单内容为,也就是说没有指定form的method属性。而问题就发生在此,Form的默认mothod属性为get. 而get是通过在发送请求的url后面加?然后加参数和值来传递数据的的,编码格式为ASCII.这就要求我们在传递的数据中有非ASCII字符或是超过了100个字符,那么你必须使用method=“post”,否则就会出现乱码。所以解决方式为:第二种乱码的解决方式+在发送页面的Form中指定method为post。
4.4 数据库中的中文出现乱码
只要涉及中文的地方全部是乱码,解决办法:在数据库的数据库URL中加上useUnicode=true&characterEncoding=gb2312就OK了。
4.5客户端读取数据库中文乱码
通过数据库客户端(比如 ODBC 或 JDBC)从数据库服务器中读取字符串时,客户端需要从服务器获知所使用的编码。当数据库服务器发送字节流给客户端时,客户端负责将字节流按照正确的编码转化成 UNICODE字符串。如果从数据库读取字符串时得到乱码,而数据库中存放的数据又是正确的。解决的办法还是通过 string = newString(string.getBytes(“iso-8859-1”), “GB2312”) 的方法,重新得到原始的字节串,再重新使用正确的编码转化成字符串。
4.6 页面在编辑工具中打开时中文乱码
在编辑工具中打开一个已经存在的项目,页面开始的编码如果是gb2312,而打开该页面的工具默认的编码如果是iso8859-1(例如myeclipse和dreamweaver),这时可能产生乱码,直接修改编辑工具的编码方式与原来页面编码一致即可。
5 结论
上面提到的方法应该能解决大部分乱码问题,如果在其他地方还出现乱码,可能需要手动修改代码。解决Java乱码问题的关键在于在字节与字符的转换过程中,你必须知道原来字节或转换后的字节的编码方式,转换时采用的编码必须与这个编码方式保持一致。
参考文献
[1]刘政.JSP数据库Tomcat产生乱码解决方案总结及原因(转一).新浪博客,1994.
[2]孙鑫.servlet/jsp深入详解.电子工业出版社,2008.