估计很多人在做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);
}

       /** 
        * 十六进制转换字符串
        * @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);   
       } 
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/

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. android recovery 升级之USB设备挂载

    Recovery升级过程,通常会从两个地方获取升级包update.zip升级,一般在线升级,会把升级包下载到cache分区,本地升级会从usb或者tf卡中升级.本文讨论下,本地USB升级时,无法挂载U ...

  2. Openjdk 安装 on centos7

    本文演示如何在CentOS7上安装openjdk. 1 准备工作 1.1 查看可安装的版本 $ yum -y list java-1.8* # 列出当前可用的安装版本 Available Packag ...

  3. Django中ORM介绍和字段及字段参数 Object Relational Mapping(ORM)

    Django中ORM介绍和字段及字段参数   Object Relational Mapping(ORM) ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简 ...

  4. Backbone.js学习之旅(一)

    前言 刚到粑粑公司,就学习各种框架,进行各种开发,为了纪念挥泪的青春,只好写下…… 希望能合您胃口^_^!!! The First(文件准备) backobone 强制依赖于 underscore.j ...

  5. Anaconda3 错误集合

    1. An error ocurred while starting the kernel 答:个人猜测有可能是配置文件出现问题,于是采用如下解决方法: 在终端中输入spyder --reset,重置 ...

  6. TERADATA数据库操作

    1.创建一个数据库的命令举例: ,spool; 注释:该命令创建了一个测试数据库testbase,其永久表空间为200mb,spool空间不能超过100mb.在teradata数据库系统的缺省方式下, ...

  7. MongoDB的安装与python操作MongoDB

    一.安装MongoDB 因为我个人使用的是windows,就只记录下windows下的安装 1.下载安装 就是官网,下载msi,选个路径安装 2.配置 看见别的地方说需要手动在bin同级目录创建dat ...

  8. Python进阶(一)

    完成慕课网的python基础学习以后,大约花了三天时间,平均每天一个小时,总结了一些比较好的例题和思想方法,下面来学习python进阶吧 参考廖雪峰官方课程 函数 python官方函数调用文档 定义默 ...

  9. 【2017下集美大学软工1412班_助教博客】团队作业9——事后分析(Beta版本)成绩公示

    作业要求 团队作业9 团队评分结果 编号 Total 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 2 ...

  10. HTTP数据组织方式

    HTTP网络传输中的数据组织方式有三种方式: 1.HTML方式 2.XML方式 3.JSON方式     XML介绍:XML称为可扩展标记语言,它与HTML一样,都是SGML(标准通用标记语言) XM ...