url 传递中文参数乱码问题的终极解决方法。
估计很多人在做web开发的时候,都会碰到过url传递中文参数,有时候会出现乱码的问题,但有些项目或者环境,又不会有问题。当遇到乱码的时候,上网找了很多解决方案,比如:
- 页面设置它的编码方式,改成utf-8 或者gb2312。
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 传递中文参数乱码问题的终极解决方法。的更多相关文章
- JS中的的Url传递中文参数乱码,如何获取Url中参数问题
一:Js的Url中传递中文参数乱码问题,重点:encodeURI编码,decodeURI解码: 1.传参页面Javascript代码:<script type=”text/javascript” ...
- URL传递中文参数乱码问题
web项目开发中,经常遇到中文参数乱码问题,而且有时候明明测试服务器上好用,换个正式环境就不用的情况也经常出现,今天做一个记录,防止自己以后忘记 1.地址栏url请求带中文参数 这类
- php中url传递中文字符,特殊危险字符的解决方法
php中的urldecode,base64_encode函数然后再结合自己写的替换函数来进行安全传递url中文字符,特殊危险字符. 需要在url中传递中文字符或是其它的html等特殊字符,似乎总会有各 ...
- Spring mvc解决url传递中文参数乱码问题
在tomcat服务器中,修改server.xml参数,如<Connector URIEncoding="UTF-8" connectionTimeout="2000 ...
- URL传递中文参数,大坑一枚,Windows与Linux效果竟然不一致(两种解决方法)
下午,计划2个小时搞定,个人官网第6次升级,就可以干点轻松的事了,结果,下午多搞了2个小时,晚上又搞了2个小时,才搞定. 最后一个世界难题是,URL传递中文参数. 问题大致是这么出现的:我为" ...
- js的url中传递中文参数乱码,如何获取url中参数问题
一:Js的Url中传递中文参数乱码问题,重点:encodeURI编码,decodeURI解码: 1.传参页面Javascript代码: <script type=”text/javascript ...
- Js的Url中传递中文参数乱码的解决
一:Js的Url中传递中文参数乱码问题,重点:encodeURI编码,decodeURI解码: 1.传参页面Javascript代码: 2. 接收参数页面:test02.html 二:如何获取Url& ...
- 通过URL传递中文参数的乱码处理
环境:web.xml中配置了 <filter> <filter-name>encodingFilter</filter-name> <filter-class ...
- URL链接中文参数乱码的若干处理方法
JAVA 中URL链接中文参数乱码的若干处理方法,现在整理收录如下: 方法一: (1) JS中,在URL参数中确保用UTF-8编码,用js函数encodeURI()编码,例如 url:"xx ...
随机推荐
- WebLogic登录管理控制台、以及相关问题解决
1.控制台的登录 登录地址是: http://管理实例IP:端口号/console 其中,管理实例的IP或者是管理实例所在主机的主机名 端口号默认7001 因此通过http://localhost:7 ...
- javasscript基础
一.使用JS完成注册表单数据校验 1.需求分析 用户在进行注册的时候会输入一些内容,但是有些用户会输入一些不合法的内容,这样会导致服务器的压力过大,此时我们需要对用户输入的内容进行一个校验(前端校验和 ...
- Fiddler抓包使用教程-基本功能介绍
转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/72932886 本文出自[赵彦军的博客] Fiddler 基本页面 会话列表功能介绍 ...
- Dell XPS 13 9306安装 macOS 10.12.6
一直在考虑买一个手上的本,轻薄,办公方便.个人很喜欢mac 下的那些软件,尤其是keynote.就锁定在Macbook Pro上,但是又觉得没有什么玩头,后来一直找,觉得xps也很符合要求,就开始调查 ...
- 17秋 软件工程 第六次作业 Beta冲刺 Scrum5
17秋 软件工程 第六次作业 Beta冲刺 Scrum5 各个成员冲刺期间完成的任务 世强:完成APP端相册.部员管理.手势签到模块: 陈翔:完成Scrum博客.总结博客,完成超级管理员前后端对接: ...
- 为什么MySQL数据库索引选择使用B+树?
在进一步分析为什么MySQL数据库索引选择使用B+树之前,我相信很多小伙伴对数据结构中的树还是有些许模糊的,因此我们由浅入深一步步探讨树的演进过程,在一步步引出B树以及为什么MySQL数据库索引选择使 ...
- 机器C盘临时区
系统的临时区里:C:\Documents and Settings\Administrator(用户名)\Local Settings\Temporary Internet Files 这是临时文件夹 ...
- centos7下安装docker(5镜像命名)
1.前面我制作了很镜像,利用docker images可以看到我自己制作的所有的镜像 第一列 是我利用docker build -t 镜像名 制作镜像指定的镜像名,但是它对应的是REPOSITO ...
- ERROR 1045 (28000): Access denied for user 'ODBC'@'localhost' (using password: NO) ERROR 1045 (28000): Access denied for user 'ODBC'@'localhost' (using password: YES)
windows下,以上两个错误的解决方法 工具/原料 windows 8 MySql 方法/步骤 找到配置文件my.ini ,然后将其打开,可以选择用记事本打开 打开后,搜索mysq ...
- (java项目)坦克大战 2.0
这个版本,只能算是一个雏形,把最基本的东西给完成了,不过,后面可添加的也不多.有一点,还是想去实现,那就是敌方坦克自己寻找对手!也就是游戏AI. emmm, 什么时候可以了解一下这个AI.顺便学学py ...