研究tomcat的URL编码笔记

阅读更多
    在JavaWeb开发的过程中,中文字符经常会出现乱码等字符集问题,一般情况下直接使用
request.setCharacterEncoding("UTF-8");
或者
request.setCharacterEncoding("GBK");

    但是昨天突然发现request.setCharacterEncoding("UTF-8")这句代码失效,前后台编码统一都是UTF-8,但通过request.getParameter("name")接收到的表单数据依然乱码,后来发现原因是表单的提交方式没有设置,也就是采用了默认的 GET方式提交。
     那为什么 GET方式会出现问题?难道request.setCharacterEncoding("UTF-8")这句代码只对POST方式提交数据才有效?
     做了一些测试之后总结出了一点规律:
     1、web浏览器对页面上通过 GET方式提交的数据会进行URL编码,采用的编码方式通常由html页面上

这个标签内的charset所指定的编码方式决定(前提是:没有自定义浏览器发送数据的编码设置)。比如现在charset="UTF-8",那么当采用get方式提交表单的时候,web浏览器默认会采用UTF-8的编码方式对数据进行编码。
所以,当请求的URL如下时:
http://localhost:8080/test/TestServlet?name=中国
其实真实内容是这样:
http://localhost:8080/test/TestServlet?name=%E4%B8%AD%E5%9B%BD
其中%E4%B8%AD%E5%9B%BD是对‘中国’二字采用了UTF-8的URL编码之后产生的字符串。
    2、所以,当数据被发送到Web服务器上的时候(测试使用tomcat6),服务器要做的一件事就是解码%E4%B8%AD%E5%9B%BD这个字符串。那么如何解码这个字符串?
    3、在JDK的java.net包下面有一个类叫做URLDecoder,该类即可对URL编码之后的字符串进行解码,如:
URLDecoder.decode("%E4%B8%AD%E5%9B%BD","UTF-8");
返回解码之后的字符串,第二个参数是指采用何种字符集解码"%E4%B8%AD%E5%9B%BD"这个字符串。打印以上代码成功显示“中国”二字,说明解码正确!
    4、前面已经说过了:web服务器会自行解码%E4%B8%AD%E5%9B%BD这个字符串,但是我们通过request.getParameter("name")得到的却是乱码,所以问题一定出在web服务器在解码E4%B8%AD%E5%9B%BD这个字符串的时候采用的字符集不对。
    5、经过测试发现,web服务器(只测试了tomcat6)对 GET方式的数据提交采用的解码字符集是"ISO-8859-1",所以web服务器其实是这样解码的:
URLDecoder.decode("%E4%B8%AD%E5%9B%BD","ISO-8859-1");
因此:明显服务器的解码方式是不对的,因为编码采用的是UTF-8,而解码却用的ISO-8859-1。
    6、所以,request.getParameter("name")返回的是用ISO-8859-1解码的字符串,那么必然是乱码了!
那么如何获得正确编码的字符串?可以采用以下的方式:
String a = new String(request.getParameter("name").getBytes("ISO-8859-1"),"UTF-8");

    总结:因为GET方式提交数据会被浏览器进行URL编码,而tomcat服务器会采用了错误的解码方式进行解码,所以得的是乱码。而POST方式提交的数据不会被浏览器进行URL编码,所以服务器直接按照request.setCharacterEncoding("UTF-8")
所指定的编码方式解析字符串,因此在POST方式下request.setCharacterEncoding("UTF-8")是好用的!


你可能感兴趣的:(Tomcat,浏览器,Web,JDK,.net)