今天遇到个js用get方法往后台传中文参数时出现乱码的问题。自己找了好久,都没有明确的答案,最后通过好几篇博文结合算是得到最后想要的结果了,现在讲下具体解决方案,供其他人快速跳过此坎。
js中有三个对字符串进行编码的函数,分别是escape()、encodeURI()、encodeURIComponent(),相应的解码函数为unescape(),decodeURI(),decodeURIComponent(),下面来分别介绍下这三个函数,最后贴上问题的解决方法。
一、escape()函数
这个函数不会对 ASCII 字母和数字进行编码,也不会对下面这些 ASCII 标点符号进行编码: - _ . ! ~ * ' ( ) 。其他的都要转换。
此函数可对字符串进行编码,这样就可以在所有的计算机上读取该字符串,因为所有机子都认识ASCII 码。
二、encodeURI() 函数
这个函数主要针对整个URI(URI是通用资源标识符,包含URL) 编码,URI中的特定标识符不会被转码,其他特殊字符则转换为特定的%+16进制字符,例如
document.write(encodeURI("http://www.baidu.com.cn/my page/")) 则输出为 "http://www.baidu.com.cn/my%20page/ (其实这个%20代表的是+,URL会把空格换成+,在文章最后说) 这样就可以直接访问了,而不会出现截断现象或者其他不识别现象
三、encodeURIComponent()函数
这个函数用的比较多,因为上面需要处理的字符串程序员本身可以刻意避免。这个函数主要对参数编码,例如中文参数,将编码为 %16进制 的字符串。
例如:http://www.baidu.com?params=encodeURIComponent("//") 这个意思就是往后台传“//”字符。如果 http://www.baidu.com?params=%2F%2F。其实我觉得最多的是处理中文了
四、URL中一些字符的特殊含义,基本编码规则如下:
1、空格换成加号(+)
2、正斜杠(/)分隔目录和子目录
3、问号(?)分隔URL和查询
4、百分号(%)制定特殊字符
5、#号指定书签
6、&号分隔参数
如果需要在URL中用到,需要将这些特殊字符换成相应的十六进制的值
+ %20
/ %2F
? %3F
% %25
# %23
& %26
五、回归问题
例如我现在要传输
location.href = "../myAction.action?name=小兵" 如果直接这样传的话小兵这个参数肯定乱码,因为是处理参数编码,根据上面可以知道应选择encodeURIComponent函数处理,具体实现为:location.href = "../myAction.action?name="+encodeURIComponent(encodeURIComponent("小兵")) ,
这样的话在后台转码就好了 ,例如我用的是java , 则 URLDecoder.decode(name,"UTF-8"); 就可以了。
至于为什么要用两个 encodeURIComponent ,读者自行参考知识点4总结(%号)。