今天遇到个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总结(%号)。