url 传递中文参数乱码问题的终极解决方法。

估计很多人在做web开发的时候,都会碰到过url传递中文参数,有时候会出现乱码的问题,但有些项目或者环境,又不会有问题。当遇到乱码的时候,上网找了很多解决方案,比如:

  1. 页面设置它的编码方式,改成utf-8 或者gb2312。
  2. encodeURI(url),也有人说要2个encodeURI,如:window.location.href = encodeURI(‘b.html?cId=‘+id+"&cName="+encodeURIComponent(name));
    然后后台String str = java.net.URLDecoder.decode(str, "UTF-8");这样进行转码等。

解决方法就不一一列举了,大家可自行百度搜索,我也搞不清楚究竟怎么能保证百分百解决问题。

项目中碰到的情况是,开发环境经过上述的2种方法,折腾过,确实能定位某个编码转换是正常的。

但部署到测试环境调试输出后发现,无论是gbk,utf8,iso等等编码测试,都无法正常还原中文字符串。

于是想到了另外一种方法,就是把中文转换为数字或者是英文字母以及标点符号等组成的字符串传递到后台,

因此有想法是把字符串加密为base64的方式传过去后,再后台再进行解密。上网找了下,没找到现成的有效方法,于是放弃了。

再后来,想着不需要加密了,直接把字符串转换成16进制传递到后台,再把它转回来吧,于是,这个终极的解决方案就出来了。

首先是jsp页面中增加脚本,把字符串转换成16进制字符串,字符之间用,号隔开,不隔开,无法区分出哪个是半角哪个是全角(如果不用,号隔开的,麻烦请提供个好的解决方法,谢谢)

function stringToHex(str){
var val="";
for(var i = 0; i < str.length; i++){
if(val == "")
val = str.charCodeAt(i).toString(16);
else
val += "," + str.charCodeAt(i).toString(16);
}
return val;
}

页面上把字符串经过该函数转换后,传递到后台,如:

var code_value=stringToHex(PrjName);
var url= "/assets/fmProjectInfo.do?method=synCheckProjectName&prjName="+code_value+"&typeId=<bean:write name="fmProjectInfoForm" property="bo.ftId"/>"

后台的转换代码为:

       public static String decode(String unicodeStr) {
        if (unicodeStr == null) {
            return null;
        }
        StringBuffer retBuf = new StringBuffer();
        int maxLoop = unicodeStr.length();
        for (int i = 0; i < maxLoop; i++) {
            if (unicodeStr.charAt(i) == ‘\\‘) {
                if ((i < maxLoop - 5)
                        && ((unicodeStr.charAt(i + 1) == ‘u‘) || (unicodeStr
                                .charAt(i + 1) == ‘U‘)))
                    try {
                        retBuf.append((char) Integer.parseInt(
                                unicodeStr.substring(i + 2, i + 6), 16));
                        i += 5;
                    } catch (NumberFormatException localNumberFormatException) {
                        retBuf.append(unicodeStr.charAt(i));
                    }
                else
                    retBuf.append(unicodeStr.charAt(i));
            } else {
                retBuf.append(unicodeStr.charAt(i));
            }
        }
        return retBuf.toString();
    }
       //把jsp页面传递进来的,用,号隔开的16进制字符串转换成 类似:select \u7528\u6237\u540d from \u7528\u6237 的字符串,在调用decode方法把中文转换出来。
       public static String jspStrInit(String sourceStr)
       {
        String[] sourceStrArray = sourceStr.split(",");
        StringBuffer sb=new StringBuffer();
        for (int i = 0; i < sourceStrArray.length; i++) {
            if (sourceStrArray[i].length()<=2)
            	sb.append(hexStr2Str(sourceStrArray[i].toUpperCase()));
            else
            	sb.append("\\u"+sourceStrArray[i]);
        }
       		return sb.toString();
       }

       public static String jspDecode(String unicodeStr) {
       		String mStr=jspStrInit(unicodeStr);
       		return decode(mStr);
       }

      public static void main(String[] args) throws Exception
	  {
      	String bb="5e02,91cd,70b9,5de5,4f5c,6d4b,8bd5";
      	String cc=jspDecode(bb);
      	System.out.println(cc);
	  }
jspDecode这个方法就是把jsp页面传递过来的字符串进行还原的。该终极解决方法就此结束。最后,在另外一个项目中有客户的研发保障,说修改意见那里有时候保存不成功,有时候又没问题,经过分析,修改意见那里是使用ajax封装了json的数据传递到后台进行更新的。由于意见里面包含了回车,标点符号等特殊符号,违反了json的原则导致的,我给他提供的解决方案,也是采用了该方案,让他把该意见转换为16进制字符串之后,传递到后台再转换回来去解决。目前还没得到问题的解决答复,但按理,应该也可以用在该场景里面。原创作品出自努力偷懒,转载请说明文章出处:http://blog.csdn.net/kfarvid或 http://www.cnblogs.com/kfarvid/
时间: 2024-12-11 13:57:32

url 传递中文参数乱码问题的终极解决方法。的相关文章

js的url中传递中文参数乱码,如何获取url中参数问题

一:Js的Url中传递中文参数乱码问题,重点:encodeURI编码,decodeURI解码: 1.传参页面Javascript代码: <script type=”text/javascript”> function send(){ var url = "test01.html"; var userName = $("#userName").html(); window.open(encodeURI(url + "?userName="

JS URL传递中文参数时出现乱码的处理

原文:JS URL传递中文参数时出现乱码的处理 在浏览器中显示的地址是这样的: 但是按F12调试的时候的地址却变化掉了: 这个肯定是是因为浏览器对url路径默认编码了.这个问题是在我们去取值的时候,得到的就是后面那一大串稀奇古怪的东西.得不到我们想要的值.怎么办呢?这里写出来的只是自己的解决方法,也许不能通用,跟大家分享下,有更好的方法,告我一声.      //得到url中的值 function request(paras){ var url = location.href; var para

URL传递中文参数,大坑一枚,Windows与Linux效果竟然不一致

下午,计划2个小时搞定,个人官网第6次升级,就可以干点轻松的事了,结果,下午多搞了2个小时,晚上又搞了2个小时,才搞定. 最后一个世界难题是,URL传递中文参数. 问题大致是这么出现的:我为"博客雷观" 这个栏目,增加了"全文搜索"功能,用lucene实现的.因此,需要传递中文参数.搜索框表单提交,传递中文,很简单就搞定了. 搜索之后的分页url,需要带上当前的"搜索词" ,比如"程序员",我在本地很轻松就搞定了.无非就是这样

解决URL带中文参数乱码问题

通过配置Tomcat来解决URL代中文参数乱码的问题. 首先打开Tomcat安装目录 打开conf文件夹 打开server.xml,在大约65行的位置,加一个属性 URIEncoding="UTF-8" 这样就支持Url中文参数了.

javascript通过url向jsp页面传递中文参数乱码解决方法

解决方法:在传递参数前将中文参数进行两次编码,jsp页面获取参数后对中文参数进行一次解码,中文参数就不会变为乱码了! 参考例子: <%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%><%@ page import="java.net.*" %><%String str0=&

关于JAVA中URL传递中文参数的问题

今天在调用一个接口时,需要传递一个中文参数,结果获取不到数据,原因就在于中文传参的编码问题. 问题来源:URL url= new URL("http://XXX?OrganName=司法厅"); 现解决办法如下: 1.对要进行URL传递的中文字符进行编码: String message = Java.NET.URLEncoder.encode("司法厅","utf-8"); 2.在取URL传递中文的页面对字符进行解码: String msg =

asp.net如何解决传递中文参数乱码问题

其实,解决此问题很简单,只需在传递的中文参数用escape()就可以解决了,至于后台c#只需用Page.Request.Params来获取就可以了! 版权声明:本文为博主原创文章,未经博主允许不得转载.

关于JAVA中URL传递中文参数,取值是乱码的解决办法

前几天看到有网友在问URLDecoder和URLEncoder方面的使用问题,突然想起,原来我刚遇到这两个类时,也觉得很神密,由此可以想想初学者的心情,于是便有了今天的这篇文章. 其实,这两个类的使用并不复杂,URLDecoder和URLEncoder它的作用主要是用于普通字符串和application/x-www-form-rulencodedMIME字符串之间的转换,一般的人会以为后一个字符串比较专业,以为有什么高深的知识,其实不然. 下面,我们在在"百度"中搜索"网络时空",会看到如下所示

HTML的Get方法URL传递中文参数,解决乱码问题

本例中有使用JQuery. 资料参考:http://www.cnblogs.com/babycool/p/3169058.html 发送的HTML页面代码: 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Index</title> 6 <script type="text/javascript"