估计很多人在做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进制字符串,字符之间用,号隔开,不隔开,无法区分出哪个是半角哪个是全角(如果不用,号隔开的,麻烦请提供个好的解决方法,谢谢)

  1. function stringToHex(str){
  2. var val="";
  3. for(var i = 0; i < str.length; i++){
  4. if(val == "")
  5. val = str.charCodeAt(i).toString(16);
  6. else
  7. val += "," + str.charCodeAt(i).toString(16);
  8. }
  9. return val;
  10. }

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

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

后台的转换代码为:

  1. public static String decode(String unicodeStr) {
  2. if (unicodeStr == null) {
  3. return null;
  4. }
  5. StringBuffer retBuf = new StringBuffer();
  6. int maxLoop = unicodeStr.length();
  7. for (int i = 0; i < maxLoop; i++) {
  8. if (unicodeStr.charAt(i) == '\\') {
  9. if ((i < maxLoop - 5)
  10. && ((unicodeStr.charAt(i + 1) == 'u') || (unicodeStr
  11. .charAt(i + 1) == 'U')))
  12. try {
  13. retBuf.append((char) Integer.parseInt(
  14. unicodeStr.substring(i + 2, i + 6), 16));
  15. i += 5;
  16. } catch (NumberFormatException localNumberFormatException) {
  17. retBuf.append(unicodeStr.charAt(i));
  18. }
  19. else
  20. retBuf.append(unicodeStr.charAt(i));
  21. } else {
  22. retBuf.append(unicodeStr.charAt(i));
  23. }
  24. }
  25. return retBuf.toString();
  26. }
  27. //把jsp页面传递进来的,用,号隔开的16进制字符串转换成 类似:select \u7528\u6237\u540d from \u7528\u6237 的字符串,在调用decode方法把中文转换出来。
  28. public static String jspStrInit(String sourceStr)
  29. {
  30. String[] sourceStrArray = sourceStr.split(",");
  31. StringBuffer sb=new StringBuffer();
  32. for (int i = 0; i < sourceStrArray.length; i++) {
  33. if (sourceStrArray[i].length()<=2)
  34. sb.append(hexStr2Str(sourceStrArray[i].toUpperCase()));
  35. else
  36. sb.append("\\u"+sourceStrArray[i]);
  37. }
  38. return sb.toString();
  39. }
  40.  
  41. public static String jspDecode(String unicodeStr) {
  42. String mStr=jspStrInit(unicodeStr);
  43. return decode(mStr);
  44. }

  45.        /** 
            * 十六进制转换字符串
            * @param String str Byte字符串(Byte之间无分隔符 如:[616C6B])
            * @return String 对应的字符串
            */   
           public static String hexStr2Str(String hexStr) 
           {   
               String str = "0123456789ABCDEF";   
               char[] hexs = hexStr.toCharArray();   
               byte[] bytes = new byte[hexStr.length() / 2];   
               int n;   
        
               for (int i = 0; i < bytes.length; i++) 
               {   
                   n = str.indexOf(hexs[2 * i]) * 16;   
                   n += str.indexOf(hexs[2 * i + 1]);   
                   bytes[i] = (byte) (n & 0xff);   
               }   
               return new String(bytes);   
           } 
  46. public static void main(String[] args) throws Exception
  47. {
  48. String bb="5e02,91cd,70b9,5de5,4f5c,6d4b,8bd5";
  49. String cc=jspDecode(bb);
  50. System.out.println(cc);
  51. }

jspDecode这个方法就是把jsp页面传递过来的字符串进行还原的。该终极解决方法就此结束。
最后,在另外一个项目中有客户的研发保障,说修改意见那里有时候保存不成功,有时候又没问题,经过分析,修改意见那里是使用ajax封装了json的数据传递到后台进行更新的。
由于意见里面包含了回车,标点符号等特殊符号,违反了json的原则导致的,我给他提供的解决方案,也是采用了该方案,让他把该意见转换为16进制字符串之后,传递到后台再转换回来去解决。
目前还没得到问题的解决答复,但按理,应该也可以用在该场景里面。

原创作品出自努力偷懒,转载请说明文章出处:http://blog.csdn.net/kfarvid或 http://www.cnblogs.com/kfarvid/

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

  1. JS中的的Url传递中文参数乱码,如何获取Url中参数问题

    一:Js的Url中传递中文参数乱码问题,重点:encodeURI编码,decodeURI解码: 1.传参页面Javascript代码:<script type=”text/javascript” ...

  2. URL传递中文参数乱码问题

    web项目开发中,经常遇到中文参数乱码问题,而且有时候明明测试服务器上好用,换个正式环境就不用的情况也经常出现,今天做一个记录,防止自己以后忘记 1.地址栏url请求带中文参数 这类

  3. php中url传递中文字符,特殊危险字符的解决方法

    php中的urldecode,base64_encode函数然后再结合自己写的替换函数来进行安全传递url中文字符,特殊危险字符. 需要在url中传递中文字符或是其它的html等特殊字符,似乎总会有各 ...

  4. Spring mvc解决url传递中文参数乱码问题

    在tomcat服务器中,修改server.xml参数,如<Connector URIEncoding="UTF-8" connectionTimeout="2000 ...

  5. URL传递中文参数,大坑一枚,Windows与Linux效果竟然不一致(两种解决方法)

    下午,计划2个小时搞定,个人官网第6次升级,就可以干点轻松的事了,结果,下午多搞了2个小时,晚上又搞了2个小时,才搞定. 最后一个世界难题是,URL传递中文参数. 问题大致是这么出现的:我为" ...

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

    一:Js的Url中传递中文参数乱码问题,重点:encodeURI编码,decodeURI解码: 1.传参页面Javascript代码: <script type=”text/javascript ...

  7. Js的Url中传递中文参数乱码的解决

    一:Js的Url中传递中文参数乱码问题,重点:encodeURI编码,decodeURI解码: 1.传参页面Javascript代码: 2. 接收参数页面:test02.html 二:如何获取Url& ...

  8. 通过URL传递中文参数的乱码处理

    环境:web.xml中配置了 <filter> <filter-name>encodingFilter</filter-name> <filter-class ...

  9. URL链接中文参数乱码的若干处理方法

    JAVA 中URL链接中文参数乱码的若干处理方法,现在整理收录如下: 方法一: (1) JS中,在URL参数中确保用UTF-8编码,用js函数encodeURI()编码,例如 url:"xx ...

随机推荐

  1. SuperMap iServer 扩展/JAVA API 系列博客整理

    转载:http://blog.csdn.net/supermapsupport/article/details/70158940 SuperMap iServer为广大用户提供了整套 SDK,应用开发 ...

  2. CentOS7系列--安装Chrome浏览器

    CentOS7系列--安装Chrome浏览器 1. 创建yum源文件 [root@server20 ~]# cd /etc/yum.repos.d/ [root@server20 yum.repos. ...

  3. Django 拾遗

    1.python_2_unicode_compatible装饰器 from django.db import models from django.utils.encoding import pyth ...

  4. HDU ACM 3790 最短路径问题

    最短路径问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Subm ...

  5. [SequenceFile_2] SequenceFile 的基本操作

    0. 说明 测试序列文件的读写操作 && 测试序列文件的排序操作 && 测试序列文件的合并操作 && 测试序列文件的压缩方式 && 测试 ...

  6. Mouse Without Borders软件,主要功能备忘录

    详细地址:https://blog.csdn.net/andylauren/article/details/64540500

  7. IDEA 如何查看一个类里面的所有方法

    快捷键:Alt+7

  8. 【Excel】SUMIF函数的兼容性

    兼容性非常强的两个函数 SUMIF() 说兼容性,当然得说SUMIF了. 来,我们先举个例子. 现有一个表格,算起来只有"科目划分"."发生额"两列内容,但是折 ...

  9. Django 项目连接数据库Mysql要安装mysqlclient驱动出错 : Failed building wheel for mysqlclient:

    1,如果直接用 CMD命令:pip install mysqlclient ,会安装出错. 2,解决问题,参考了这个博友的帖子:https://blog.csdn.net/qq_29784441/ar ...

  10. golang中的init函数以及main函数

    首先我们看一个例子:init函数: init 函数可在package main中,可在其他package中,可在同一个package中出现多次. main函数 main 函数只能在package ma ...