在JavaWeb应用开发中,经常会出现页面中本该显示中文的地方却是乱码的情况。究其原因,主要是由于在Web组件之间、或Web组件与浏览器、与数据库所使用的字符集标准不统一,Web应用程序运行过程中,中文字符往往需要在不同的字符集之间来回转换,这就导致了中文乱码问题的频繁出现。本文从Web应用的常用编码出发,详细讨论JavaWeb应用开发中出现中文乱码的原因以及解决办法。本文讨论的环境是基于JDK5.0,服务器为Tomcat5.5,数据库为MySQL5.0。
1 Web应用的常用编码
Web应用中常用的编码主要有ISO8859-1,GB2312,GBK,Unicode和UTF-8。
1.1 ISO8859-1
ISO8859-1,是国际标准化组织内ISO/IEC8859的第一个8位字符集,属于单字节编码,最多能表示的字符范围是0-255,应用于英文系列。
1.2 GB2312/GBK
GB2312和GBK是*国家标准汉字信息交换用编码,简称国标码,专门用来表示汉字,是双字节编码。其中GBK编码能够用来同时表示繁体字和简体字,而GB2312只能表示简体字。
GB2312和GBK是*国家标准汉字信息交换用编码,简称国标码,专门用来表示汉字,是双字节编码。其中GBK编码能够用来同时表示繁体字和简体字,而GB2312只能表示简体字。
1.3
UnicodeUnicode(统一的字符编码标准集)使用2个字节对每一个字符进行编码,是Java语言默认的字符集。
1.4UTF-8
UTF-8编码,用1到6个字节编码Unicode字符,用在网页上可以在同一页面显示中文简体繁体及其他语言。
UTF-8编码,用1到6个字节编码Unicode字符,用在网页上可以在同一页面显示中文简体繁体及其他语言。
2 Web应用中的中文乱码问题的分析
在Web应用中,通常包括了浏览器、Web服务器、Web应用程序和数据库等部分,每一部分都有可能使用不同的字符集,从而导致字符数据在各种不同的字符集之间转换时出现乱码问题。
在弄清Web应用中的中文乱码问题前,先明确理解JavaWeb开发中所用到的JSP/Servlet应用程序中的几个有关编码设置的方法。
在JSP/Servlet中主要有以下几种方式可以设置编码("***"表示编码方式):
在Web应用中,通常包括了浏览器、Web服务器、Web应用程序和数据库等部分,每一部分都有可能使用不同的字符集,从而导致字符数据在各种不同的字符集之间转换时出现乱码问题。
在弄清Web应用中的中文乱码问题前,先明确理解JavaWeb开发中所用到的JSP/Servlet应用程序中的几个有关编码设置的方法。
在JSP/Servlet中主要有以下几种方式可以设置编码("***"表示编码方式):
1) pageEncoding="***"的作用是设置JSP编译成Servlet时使用的编码。
2) contentType="text/html;charset=***"的作用是指定对服务器响应进行重新编码的编码。
3) request.setCharacterEncoding("***")的作用是设置对客户端请求进行重新编码的编码(仅仅只适用于设置 post提交的requestbody的编码而不是设置 get方法提交的queryString 的编码。该方法告诉应用服务器应该采用什么编码解析 post传过来的内容。)。
4) response.setCharacterEncoding("***")的作用是指定服务器响应客户端请求时进行重新编码的编码。JSP文件的运行过程如图1所示。
当JSP引擎把JSP文件按pageEncoding所指定的编码方法编码转换为Servlet文件时,若pageEncoding没有指定,则按照contentType所指定方法编码。若二者都没有指定,则将按照JVM的默认编码方法进行编码。若这一步骤编码不支持中文,则JSP文件中的中文转化为Servlet文件时本身就是乱码。
客户端浏览器在发送和接收数据时,按照JSP文件的contentType所指定的编码方式来对URL和参数编码。服务器在接收数据时,按照request.setCharacterEncoding的设置对数据进行编码,在发送数据时,按照response.setCharacterEncoding—contentType—pageEncoding的优先顺序对要发送的数据进行URL编码。在这个过程中,如果参数中包含中文,而没有设置好编码方式,服务器在处理数据的过程中就会出现中文乱码问题。
3 JavaWeb开发中文乱码问题的解决方法
3.1 页面显示乱码
如果在访问某个JSP页面或者Servlet产生的页面时,页面上本应显示中文信息的地方,却显示为乱码,这可能是浏览器显示不正确,也可能是后台在动态生成界面的时候,其内容就是乱码。
如果是浏览器显示的问题,需要设置JSP或者Servlet的contentType属性。对于JSP中的设置使用的是page指令,设置如下:<%@page contentType=”text/html”;charset=”GB2312”>,对于Servlet生成的页面,可以在输出页面之前调用response的setContentType()方法,其代码形式如下:response.setContentType(“text/html;charset=GB2312”)另外,在生成的HTML文件的头部可以加入如下代码:<meta http-equiv=“contenttype”content=“text/html;charset=GB2312”>以减少中文乱码的发生。
3.2 用户提交的数据是乱码
当表单中提交的中文数据出现乱码时,原因是request对浏览器提交的数据解码不正确。根据表单提交方式的不同,此类乱码问题有两种解决方法。
对于表单中POST方式提交的数据,数据是作为请求的消息体发送的,默认情况下采用ISO8859-1编码,所以要设置请求对象的字符编码,代码形式如下:
request.setCharacterEncoding("GB2312"),在响应页面上使用response.setCharacterEncoding("GB2312")设置编码方式。如果需要处理的页面过多时,单个处理就会比较麻烦,这时可以通过设置过滤器将所有的request编码都进行设置。
对于表单中GET方式提交的数据或者URL提交的数据,只在接收数据的JSP文件或Servlet文件中设置request.setCharacterEn⁃coding参数是不行的,因为在Tomcat5.0中,默认情况下使用ISO8859-1对URL提交的数据和表单中GET方式提交的数据进行编码。因此,在这种情况下,需要修改Tomcat的server.xml文件。具体方法如下:
在Tomcat的server.xml文件中,在port号为8080的Connector元素中增加一个属性:URIEncoding="GB2312"。
Java中网络传输使用的标准字符集是ISO-8859-1,所以在后台用request.getParameter("message");获取前台传过来的中文时,得到的还是ISO-8859-1字符集,中文就会出现乱码现象,好多人的解决办法是在前台传递中文之前进行decode,后台再decode一下进行转换,这样感觉很是麻烦
处理方法一:
js 程序代码:url=encodeURI(url);注意是整个URL
服务器端的代码:String linename = new String(request.getParameter("name").getBytes("ISO-8859-1"),"UTF-8");
处理方法二:
js:var url="name="+name;
url=encodeURI(encodeURI(url)); //用了2次encodeURI
window.location = "<%=path%>/inner/line/line.jsp?"+url;
服务器端的代码:
String linename = request.getParameter(name);
//java : 字符解码
linename = java.net.URLDecoder.decode(linename , "UTF-8");
js:var url="name="+name;
url=encodeURI(encodeURI(url)); //用了2次encodeURI
window.location = "<%=path%>/inner/line/line.jsp?"+url;
服务器端的代码:
String linename = request.getParameter(name);
//java : 字符解码
linename = java.net.URLDecoder.decode(linename , "UTF-8");
参考案例:http://www.cnblogs.com/o-andy-o/archive/2013/03/04/2942976.html