在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页面上
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
这个标签内的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编码格式设置,通过设置编码,解决网页中数据传输乱码问题
我做的一个url加密解密,很简单,适合与新手参考学习。
tomcat源码研读笔记涉及到了tomcat的版本,笔记是基于这个版本的tomcat源码进行研读并写下的笔记
如何修改tomcat的编码为utf-8,大家可以看看
tomcat学习笔记 tomcat学习笔记
本文件为尚硅谷Tomcat的课堂学习笔记实录,讲解的清晰到位,适合入门Tomcat,掌握如何使用Tomcat
完整图解 Tomcat 5.0.28 安装笔记
关于tomcat服务器配置的详细说明,以及struts与此服务器的使用
Browser/Server 浏览器/服务器 访问服务器资源不需要专门安装客户端软件,而是直接通过浏览器访问服务器资源. 例如: 天猫、京东、知乎网站 开发者通过web服务器可以把...进入Tomcat安装目录/conf/server.xml 文件修改
tomcat6 学习笔记 tomcat5 tomcat 学习笔记/总结日志
tomcat字符编码总结 深入了解!从网上搜集了很多,自己整理的
tomcat笔记
学习tomcat7.0的官方网站时候记录的笔记,共大家参考。
修改Tomcat默认编码消除get方式传递参数出现中文乱码修改Tomcat默认编码消除get方式传递参数出现中文乱码修改Tomcat默认编码消除get方式传递参数出现中文乱码修改Tomcat默认编码消除get方式传递参数出现中文乱码
Tomcat部署笔记
Tomcat学习笔记和课件,欢迎学习爱好者下载资源,共同学习。。
tomcat实战笔记,讲的挺详细的,虽然用不到那么细,但是可以看看,对自己还是有点用处的
tomcat6学习笔记( 包括和apache2的集成,集群,SSI,SSL,嵌入应用程序,访问控制平台和管理平台)
Tomcat&Servlet学习笔记