关于 URL 传递中文参数R额quest获取参数出现乱码的解决方案

Js提交代代码:

Var  username= "中国";

URL = $.pathname()+ '/page/business/sup/facility/specificCollect/bridge.jsp?username=' + username;

1、使用post方式传递的数据

在控制台中打印获取到的username的值,显示的是乱码,这个是因为Request域中的采用的是ISO8859-1码表的,而我们的jsp使用的是utf-8编码的,所以当我们点击提交的时候,浏览器会将"中国"使用utf-8码表编码,然后web容器创建一对request/response容器对象,数据传入到request容器中,因为request容器使用的是iso8859-1编码的,所以当我们在Servlet中从request容器中读取数据,使用的是iso8859-1进行解码的,所以会出现乱码了,所以我们只需要将request的容器码表设置成和我们页面显示的码表一样就可以了。这样我们在getParameter的时候得到正确的解码(utf-8)数据

  1. request.setCharacterEncoding("utf-8");  
  2. String name = request.getParameter("username");  
  3. System.out.println("username:"+name);  

2.使用get方式传递数据的乱码问题

发现request.setCharacterEncoding("UTF-8")这句代码失效,前后台编码统一都是UTF-8,但通过request.getParameter("username")接收到的表单数据依然乱码,后来发现原因是表单的提交方式没有设置,也就是采用了默认的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服务器上的时候,服务器要做的一件事就是解码%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服务器对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解码的字符串,那么必然是乱码了! 
那么如何获得正确编码的字符串?可以采用以下的方式: 

  1. String a = new String(request.getParameter("name").getBytes("ISO-8859-1"),"UTF-8");   
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")是好用的! 

这里的解决方式有两种,

一种:是通过String类的getBytes方法进行编码转换,具体java代码是:

  1. new String(request.getParameter(“name”).getBytes(“iso-8859-1”),“客户端编码方式”)  
new String(request.getParameter(“name”).getBytes(“iso-8859-1”),“客户端编码方式”)

这里的客户端编码方式就是页面的编码,比如demo.jsp中使用的是utf-8

第二种:在服务器server.xml代码中改配置信息:

  1. <Connector port="8080"protocol="HTTP/1.1"  maxThreads="150" connectionTimeout="20000"  
  2. <span style="white-space: pre;">    </span>   redirectPort="8443"URIEncoding="客户端编码"/> 
<Connector port="8080"protocol="HTTP/1.1"  maxThreads="150" connectionTimeout="20000"
	   redirectPort="8443"URIEncoding="客户端编码"/>

这样我们就修改了Tomcat中的编码和解码字符集了。当tomcat获取客户机使用get方式带来的数据使用URL解码的字符集

当然我们之后修改server.xml之后需要重启服务器的,所以第二种方式是不赞同使用的。

实际中遇到的问题




Var  username= "中国";

URL = $.pathname()+ '/page/business/sup/facility/specificCollect/bridge.jsp?username=' + username;


将url用encodeURI转换两次
 diag.URL=encodeURI(encodeURI(URL));

Jsp中接收参数代码:

             <% String value= java.net.URLDecoder.decode(request.getParameter("username"),"UTF-8");%>
                var infoId="<%=value%>

 alert(infoId)

得到的infoId结果:“中国”



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值