jsp的传参乱码我分成两种类型:一种是采用url地址直接传参,浏览器采用自己的默认编码方式给url及参数编码而服务端没有解码或采用错误方式解码造成乱码;第二种是表单进行传参(post下的三种enctype方式),浏览器采用自己的编码,而服务端没有解码或解码方式错误,造成乱码。
【第一、url传递参数】
看到这个大家可以参考一下网页url传递参数的标准编码方式,16进制,传送门
http://www.w3school.com.cn/tags/html_ref_urlencode.html
一篇很好的文章:
http://blog.csdn.net/gcz564539969/article/details/8176150
下面我们写一些代码来测试一下chrome浏览器,firefox及ie8及javascript对url编码的方式。
新建一个页面,名为:
UurlEncode.jsp
代码如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title></title>
</head>
<body>
<%
String urlEncodeString=request.getQueryString();
%>
<h1>网址测试:http://localhost:8080/UurlEncode.jsp?width=dfdfdf&ok=90()&hello=您好</h1>
<h2>url的query string 是:</h2>
<h1><%=urlEncodeString%></h1>
<input type="button" id="clickme" value="点击我将url编码"/>
<script type="text/javascript">
document.getElementById("clickme").οnclick=function(){
alert(encodeURI("http://localhost:8080/UurlEncode.jsp?width=dfdfdf&ok=90()&hello=您好"));
}
</script>
</body>
</html>
然后运行这个文件,分别在三种浏览器里面输入测试用的网址“http://localhost:8080/UurlEncode.jsp?width=dfdfdf&ok=90()&hello=您好”
下面是几个浏览器的测试结果:
【chrome】
【firefox】
【ie8】
看看,各个浏览器的编码都不一样,只有javascript的是保持一致。
【在这里不得不吐槽一下,又是ie在拖后腿,但凡搞过前端的人肯定对ie系列--尤其ie6的种种兼容性蛋疼,html5虽然被吹到天上去了,但是ie6-ie9这几个家伙是无法享受html5的好处的,烦的还是前端开发人员。】
所以这里只有一个建议:尽量不要用特殊字符及中文作为参数,即使用了,也要用javascript的encodeURI进行编码,后台再进行相应解码。
【前一篇文章里面的代码就没有进行这种解码了,需要添加上去。】
【补充:对页面尽量统一编码,譬如:utf-8,然后用javascript对带有特殊符号或中文的url进行编码,而firefox似乎是按照当前系统的编码(譬如我的系统是中文,gbk)的16进制进行编码,而ie---就当我没看见,所以比较好的解决方案是,带有特殊字符的url采用javascript的encodeURI来编码,后台jsp用java.net.URIDecoder(String,"utf-8")进行解码】
【第二、表单提交数据的中文及特殊字符及对应处理方式】
下面对摘抄一段话:
总结
- 字符->字节:编码,字节->字符:解码
- URI编码是用一个字符串表示另一个字符串,URI编码就是用要编码的字符串根据指定的字符集解码后每个字节码前加上%组织的字符串,例如“中”的UTF-8编码为E4 B8 AD三个字节,那么其UTF-8的URI编码为:%E4%B8%AD组织的字符串
- 浏览器的发送给服务器的URL只能包含ASC字符,如果URL中包含非ASC字符,浏览器会进行URI编码
- post提交时,表单的数据会根据页面编码的字符集进行编码发送到浏览器(每个form也可以单独设置编码字符集,如果没设置则采用页面的编码字符集)
- get提交时,表单中的数据会根据页面的字符集进行URI编码
- 链接中直接带有非ASC字符时,浏览器也会进行编码,但编码所用的字符集跟浏览器有关
- 需要在url后面添加非ASC字符的参数时,更安全的做法是自己进行根据指定的字符集进行URI编码,因为不同的浏览器编码结果可能不一样
- request.getParameter获得值经过了服务器的解码,POST方法时所有的服务器都是通过setCharacterEncoding进行解码的,GET方法时,WebSphere和apusic也是使用setCharacterEncoding指定的字符集进行解码,tomcat5则是通过ISO8859-1进行解码
- 可以通过调整tomcat5的配置来指定get方法时request.getParameter解码所用的字符集,修改server.xml中Connecter元素,增加属性URIEncoding="UTF-8"设定字符集,或者增加属性useBodyEncodingForURI="true"表示使用页面的编码所用的字符集
- 解决乱码的最好方法是编码5统一:页面编码=URI编码=setCharacterEncoding=文件保存编码=jsp编译编
【
经过资料收集,我认为:无论是url(get方式的form与url一样方式)还是post数据,都是
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
浏览器都是根据这个标志(charset)来进行编码,然后服务端采用自己的方式解码,最后到用户获取数据;
譬如:tomcat对url及post数据默认是用ISO8859-1解码,这就是为什么有中文的时候会乱码,但是可以用new String(string.getBytes("ISO8859-1"),"UTF-8"【假设utf-8是page 的 contentType】)来正确获取中文。
post,get(以及url)不同之处在于,post数据会直接根据contentType编码,但是url和get会先由浏览器进行%xxx这种16进制字符方式转换,所以需要在后台用ISO8859-1不会出现乱码,出现的是%xxx,还需要进一步解码
】