關(guān)于a href傳參的中文亂碼問題

當(dāng)需要href進行傳參,參數(shù)為中文時,會出現(xiàn)亂碼問題,最簡單的方法是:
傳入的值首先用escape()進行加密,然后在取值頁面用unescape()解密,親測有效。
網(wǎng)上查了一下還有用urlencode進行加密,urldecode解密。
額...那這兩者有啥區(qū)別呢,隨手查閱整理了一下,來源(http://www.cnblogs.com/glory-jzx/archive/2013/06/14/3135580.html):
js對文字進行編碼涉及3個函數(shù):escape,encodeURI,encodeURIComponent,相應(yīng)3個解碼函數(shù):unescape,decodeURI,decodeURIComponent
1、 傳遞參數(shù)時需要使用encodeURIComponent,這樣組合的url才不會被#等特殊字符截斷。
例如:<script language="javascript">document.write('<a href="http://passport.baidu.com/?logout&aid=7&u= +encodeURIComponent("http://cang.baidu.com/bruce42")+">退出< /a>');</script>
>2、 進行url跳轉(zhuǎn)時可以整體使用encodeURI
例如:Location.href=encodeURI("http://cang.baidu.com/do/s?word=百度&ct=21");
3、 js使用數(shù)據(jù)時可以使用escape
例如:搜藏中history紀錄。
4、 escape對0-255以外的unicode值進行編碼時輸出%u****格式,其它情況下escape,encodeURI,encodeURIComponent編碼結(jié)果相同。
5、 最多使用的應(yīng)為encodeURIComponent,它是將中文、韓文等特殊字符轉(zhuǎn)換成utf-8格式的url編碼,所以如果給后臺傳遞參數(shù)需要使用encodeURIComponent時需要后臺解碼對utf-8支持(form中的編碼方式和當(dāng)前頁面編碼方式相同)
6、 不編碼:
escape不編碼字符有69個:*,+,-,.,/,@,_,0-9,a-z,A-Z
encodeURI不編碼字符有82個:!,#,$,&,',(,),*,+,,,-,.,/,:,;,=,?,@,_,~,0-9,a-z,A-Z
encodeURIComponent不編碼字符有71個:!, ',(,),*,-,.,_,~,0-9,a-z,A-Z
【escape() encodeURI() 區(qū)別?】
escape() 方法:
所有空格、標點符號、重音字符,以及任何其他非ASCII字符都編碼改為"%XX"的形式,xx是16進制數(shù)字所代表.
escape和unescape的編碼和解碼功能, escape返回16進制編碼的一種ISO拉丁字符集. unescape的功能將具有特殊值的16進制編碼轉(zhuǎn)換為ASCII字符串
舉例:
escape('!@#$%^&*(){}[]=:/;?+\'"'):
結(jié)果:%21@%23%24%25%5E%26*%28%29%7B%7D%5B%5D%3D%3A/%3B%3F+%27%22
encodeURI() 方法
Encodeuri方法返回一個編碼后的URI. 因此,如果你將其結(jié)果用Decodeuri方法,原始的串會返回. Encodeuri的方法并不對以下字符編碼:":"、"/"、"; "、"? ". 但可以使用 encodeuricomponent 的方法對這些字符進行encode.
encodes,一種 Uniform Resource Identifier (URI)(URI)逐一替換某些字符,描述為UTF-8編碼的特點.
例如 :
encodeURI('!@#$%^&*(){}[]=:/;?+\'"'):
結(jié)果:!@#$%25%5E&*()%7B%7D%5B%5D=:/;?+'%22
encodeURIComponent() 方法:
encodeuricomponent 方法返回一個編碼的URI. 因此,如果你將decodeuricomponent,原來的串會返回. 由于所有文字encodesencodeuricomponent方法都會進行編碼,所以要小心,如果存在路徑等串例如: "/FOLDER1/FOLDER2/DEFAULT.HTML". 加密后并不會,如果作為一個網(wǎng)絡(luò)服務(wù)器的請求將會失效. 使用這種方法Encodeuri當(dāng)字符串超過一個以上URI組成.
例子:最簡單的方法就是看它們加密這些字符后生成的代碼.
encodeURIComponent('!@#$%^&*(){}[]=:/;?+\'"'):
結(jié)果 !%40%23%24%25%5E%26*()%7B%7D%5B%5D%3D%3A%2F%3B%3F%2B'%22
【什么時候適合用什么方法?】
escape() 方法不會加密 + 在服務(wù)器端會被解析為空格以及在表單forms區(qū)域中的spaces.基于這樣的縮減方式,你應(yīng)該盡可能的避免使用這種方法,二選一的話,最好的經(jīng)常使用 encodeURIComponent().
escape() 不會加密: @*/+
使用encodeURI() 比 escape() 稍專業(yè)化,它是針對URIs編碼的 .一個做為querystring的反面, 屬于URL的一個部分.使用這種方法是當(dāng)你需要將一個字符串轉(zhuǎn)換為URIs資源標識以及需要某些字符保持非encode狀態(tài).請記住, 這個' 字符是不會進行編碼的,因為它本身就包括在URIs里.
encodeURI()不會加密: !@#$&*()=:/;?+'
最后, encodeURIComponent() 方法用在大多數(shù)cases中,當(dāng)你需要對一個單獨URIs部件進行編碼,這種方法可以加密某些特殊用于的URIs的字符,因此大部分部件可以包含在里面. 記住, ' 字符本身就包括在URIs里,所以不會此方法不會對其進行編碼.
encodeURIComponent() 不會加密: !*()'
http://shijian0306.javaeye.com/blog/241264
小編只用過escape,so起參考作用
以上這篇關(guān)于a href傳參的中文亂碼問題就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
原文地址:http://www.cnblogs.com/zhangym118/archive/2016/07/05/5644915.html
相關(guān)文章
Web程序調(diào)用本地exe文件之方法(并傳參到CS程序)
本程序只是我想到的比較通用的Web系統(tǒng)調(diào)用客戶端Mac地址的方法。如果大家有更好的辦法,歡迎大家提出討論。謝謝。2014-08-05- 遇到了很不常見的參數(shù)亂碼的問題,點擊的時候傳遞帶參數(shù)的網(wǎng)頁地址,由于我傳遞的參數(shù)為漢字,在后臺獲取為亂碼2013-04-12