JSP乱码问题思考及解决方法
一、引起乱码的原因有:
1、响应中的乱码:即显示页面上的乱码,如index.jsp显示出来时,"用户名"显示为乱码
2、表单提交时的乱码:即在表单的文本框中输入为中文的时候提交到服务出现乱码
二、针对各原因的解决思路及方法:
1、响应中的JSP乱码:
说明:
(1).常见的编码方式:
ISO-8859-1,GB18030,GB2312,UTF-8;
(2)pageEncoding的含义:
pageEncoding表示的是该JSP页面的编码,也就是你要保存一个JSP页面,系统会以这个编码来保存(我们知道文本文件另存为的时候会弹出一个提示窗口,你细心一下就会发现原来可以选择不同的"编码"来保存),
同理,JSP文件默认保存的时候会以你设置的pageEncoding的属性值保存该JSP页面。
Eclipse中如果你设置了Window\preferences\jspfiles面版上的Encoding为某一个值如GB2312,则以后新建一个JSP文件的时候系统会自动加上pageEncoding="GB2312"这一属性。
注意:pageEncoding="ISO-8859-1"的时候是不能保存中文的,就是说如果你设置为ISO-8859-1,但又想在JSP文件中写一段中文,保存文件的时候会提示不能保存。
(3)JSP实现过程:
客户提交URL请求如:www.WebTest.com/index.jsp
服务器接收到请求
服务器寻找本地文件index.jsp
服务器将index.jsp转译为index.java再编译为index_jsp.class文件,并将其作为响应发给客户端
客户端浏览器解释执行得到HTML代码并显示给客户
由上可见,要解决响应中的JSP乱码问题要注意三点:
I、对本地文件index.jsp的pageEncoding属性检查,因为服务器接到请求后首先是找这个文件。pageEncoding可设为GB18030,GB2312,UTF-8
II、JSP使用<%@pagecontentType="text/html;charset=GB2312"%>为响应添加编码信息,这里如果charset="ISO-8859-1",显示出来的中文肯定是乱码。
III、记得在<head></head>中加入<metahttp-equiv="Content- Type"content="text/html;charset=GB2312">注意这句话应是在<head>之后的首句话,因为有可能<title></title>中使用了中文,如果加在</title>后,则title内容显示会出现乱码。这里的charset值最好与contentType中的charset值一致。
经过上面三步即可解决响应乱码即显示出来的页面中有乱码的情况。
2、表单提交乱码:
说明:
(1)表单的文本框中输入为中文的时候提交到服务出现乱码的主要原因是:表单提交即发送请求的过程中使用的编码是ISO-8859-1.
表单提交方式有POST和GET,所以表单提交乱码为POST乱码和GET乱码
I、POST乱码
解决方法是在JSP页面中加入语句:<%request.setCharacterEncoding("UTF-8");%>
II、GET乱码
POST方式下的解决方式还算简单,因为POST方式下提交的数据都是以二进制的方式附加在http请求的body部分发送,只需要在后台指定编码格式就足矣解决。
GET方式下会将参数直接附加到url后面,这部分参数无法使用request.setCharacterEncoding()处理,结果就是get形式的所有中文都变成了乱码。
这里只能对提交的内容转换成字节再转換成另一编码的字符:如下:
- <%
- Stringusername=request.getParameter("username");
- byte[]bytes=username.getBytes("iso-8859-1");
- Stringresult=newString(bytes,"gb2312");
- out.print(result);
- %>
理解起来很简单:首先我要获得与现有编码不同的编码的字符串,String类中构造函数:newString(byte[],charsetch);
那么现在我需要一个字节数组,即要对原来的字符串进行转换,从字符串变成字节数组,String类中的getBytes(charsetch)函数
所以结合起来就是:newString(username.getBytes("iso-8859-1"),"gb2312");