JAVA 中URL中文参数乱码的处理方法

来源:互联网 发布:小米5s plus 知乎 编辑:程序博客网 时间:2024/05/16 00:32

       一般情况下url中文参数乱码,只要设置好页面编码格式,然后把tomcat的server.xml设置一下就好了,但是现在这个项目因为tomcat下面放的不止一个项目,改设置可能会引起其他项目的编码问题,所以不能改,为此颇纠结了一番,而网上很多方法就是用escape()、encodeURI()、encodeURIComponent()来编码,然后去后天通过硬编码new String(s.getBytes("iso-8859-1"),"gbk"); 但是很显然  硬编码是不行的,或者至少说不是通用的,换一个tomcat可能又错了。上面的编码方式只能把ISO的编码转成GBK,但是如果换一个tomcat,已经设置了UTF-8编码,那么这种编码肯定会出错。

     1、ajax提交乱码

     提交方式1:

$.ajax({     url:'<%=basePath%>/pages/getInfo.do',    type: "POST",   data:'TXTCONTENT=updateContactToServer&userInfo='+userid+"&groupId="+zd,   success: function(jsonstr){       var uid = $("#hideUserId").val();    }});  
      提交方式2:

$.ajax({     url:'<%=basePath%>/pages/getInfo.do?TXTCONTENT=updateContactToServer&userInfo='+userid+"&groupId="+zd,    type: "POST",   success: function(jsonstr){        var uid = $("#hideUserId").val();    }});         
以上两种ajax提交方法如果参数userid是中文,那么第一种提交方法不会有问题,而方法二会有问题,原因我不是很清楚,但是分析一下,应该是第二种提交方式把参数作为URL  然后再tomcat中对URL用ISO-8859-1解码,所以中文出现乱码。而第一种提交方式中参数是在表单中提交,tomcat只对URL转码,所以中文参数不会出现乱码。只是个人分析,如有错误,求高人指点!如果有人用ajax提交出现乱码了,可以试试第一种方式提交一下。

       2、普通的URL请求乱码。

       网上很多人给出escape()、encodeURI()、encodeURIComponent()的解决方法,具体三个方法我就不解释了,网上很多。我想说的是 只用三个方法中的一个类似这样

      var url='<%=basePath%>/pages/deleteGroup.do?zdName='+encodeURIComponent(zdname)+"&groupId="+hideZD+"&count="+s; ;      window.location.href=url;

    是不行的,到后台依然会出现乱码,必须用两次

     var url='<%=basePath%>/pages/deleteGroup.do?zdName='+encodeURIComponent(zdname)+"&groupId="+hideZD+"&count="+s; ;     window.location.href=encodeURI(url);
  这样在后台才不会出现乱码,只不过我们在后台要用URLDecoder.decode("zdname", "UTF-8");解码一次!

      原因分析:在页面用encodeURIComponent或者encodeURI转码,能转成十六进制的字符串,但是在往服务器传递过程中URL首先要经过tomcat  而tomcat会对URL解码成中文,这样tomcat再传递到后台还是会出现中文乱码,而用encodeURIComponent转码两次的话,经过tomcat转码一次,还是十六进制字符串,在传递给服务器时接收的就还是转码后的字符串,然后我们在java代码中用URLDecoder解码一次就能出现正确中文了!

       同时,如果是java代码中使用httpclient的时候中的URL也可以URLEncoder和URLDecoder来转码和解码,原理一样。

       结语: 关于URL乱码的问题,网上很多都是讲解encodeURIComponent 或者是通过new String(s.getBytes("iso-8859-1"),"gbk");来解决,以上两种方法是我经过多次实验后获得的,原因分析可能不对,但是确实有用。如果对你有帮助,赞一个。