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 ...
随机推荐
- 在Visualforce页面中使用Visual Flow
在本文中,我们将通过一个示例说明如何将"流"(Visual Flow)用于Visualforce页面. 更全面的知识可以参考官方文档. 创建流 我们要创建一个流,它的作用是得到一个 ...
- MVC与单元测试实践之健身网站(完)-备案与部署
主页-http://www.zhixin9001.cn/Home/Introduce GitHub- https://github.com/zhixin9001/Fitness 这是关于Fit网站的最 ...
- MQTT详解以及在IoT中的应用
MQTT定义: MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议,有可能成为物联网的重要组成部分.该协议支持所有平台, ...
- 使用openssl在windows 10下本地xampp配置https开发环境
安装win64OpenSSL-1_1_0j后重新启动:以管理员权限启动powershell; 执行以下命令 set OPENSSL_CONF=c:\xampp\apache\conf\openssl. ...
- windows任务管理器怎么知道多个IIS网站进程分别对应哪个网站
摘要: 1.IIS网站对应的进程名一般叫w3wp.exe (windows2008系统为例,其他类似) 2.windows默认的任务管理器只能看到多个同名的进程名w3wp.exe,没法区别分别对应哪个 ...
- cmd 命令
cmd 在桌面或任意磁盘新建一个TXT--输入CMD并保存--修改扩展名为.BAT md 文件夹名 新建文件夹cd 文件夹名 进入到该目录cd.. 返回上一层目录cd\ 返回根目录cd.>文件名 ...
- python学习-判断是否是私网IP地址
判断是否是私网IP地址 私网IP地址范围如下: 192.168.0.0-192.168.255.255 172.16.0.0-172.31.255.255 10.0.0.0-10.255.255.25 ...
- 在 vs2017 中使用 C# 7 新特性。
几个概念区分: 1.C# C# 是一种.net 语言,与此类似的还有 vb,F#.不同版本的语言要配合相应的解释器才能发挥作用.目前 最新版本 为 C# 7.3. 2.VS VS 是 ...
- 17秋 软件工程 团队第五次作业 Alpha 用户反馈
用户反馈 Bug 测试对不同机型进行了测试,包括: 小米NOTE, MIUI 8.5 稳定版 [已修复]点登录按钮之后自动退出: [已修复]登录界面的背景图片没有显示. 小米4 [已修复]闪退,无法打 ...
- 类装载器-ClassLoader
类装载器的工作机制 类装载器就是寻找类的字节码文件并构造出类在JVM内部表示对象的组件.在Java中,类装载器把一个类装入JVM中,需要经过以下步骤: 装载:查找和导入Class文件. 链接:执行校验 ...