編碼就是把能看的懂得字符轉換成一些奇奇怪怪的二進制字節(jié)碼文件
解碼就是把哪些看不懂的二進制字節(jié)碼轉換成能看的懂得字符
為什么要進行編碼
在URI的最初設計時,希望能通過書面轉錄拣播,比如寫在餐巾紙上告訴另外一人,因此URI的構成字符必須是可寫的ASCII字符碟嘴。在這些可書寫的字符里,由于一些字符在不同操作系統(tǒng)的編碼有不同的解析囊卜,被包含在“不安全字符”之中娜扇,要格外注意。
廢話少說栅组,我們先來準備一個字符串
var str = 'http://www.baidu.co m/+do/s?word=百度&ct=21';
escape() 和 unescape()
var a = escape(str);
console.log(a)
結果:http%3A//www.baidu.com/do/s%3Fword%3D%u767E%u5EA6%26ct%3D21
返回一個以編碼string的副本雀瓢。 其中的某些字符被替換成了16進制的轉義序列
該方法不會對 ASCII 字母和數(shù)字進行編碼,也不會對下面這些 ASCII 標點符號進行編碼: - _ . ! ~ * ' ( ) 玉掸。其他所有的字符都會被轉義序列替換刃麸。
只能被unescape()所解碼,使用decodeURI()和decodeURIComponent()解碼時會直接報錯司浪。
js使用數(shù)據(jù)時可以使用escape泊业。
var b = unescape(a);
console.log(b)
結果:http://www.baidu.com/do/s?word=百度&ct=21
只能解碼escape()所轉的編碼,解碼encodeURI()和encodeURIComponent()轉的URI時會把文字轉為(奇奇怪怪的亂碼)特殊編碼啊易。
encodeURI 和 encodeURIComponent()
var c = encodeURI(str);
console.log(c)
結果:http://www.baidu.com/do/sword=%E7%99%BE%E5%BA%A6&ct=21
返回一個URLstring的副本吁伺,其中的某些字符將被16進制的轉義序列進行替換。
該方法不會對 ASCII 字母和數(shù)字進行編碼认罩,也不會對這些 ASCII 標點符號進行編碼: - _ . ! ~ * ' ( ) 箱蝠。該方法的目的是對 URI 進行完整的編碼,因此對以下在 URI 中具有特殊含義的 ASCII 標點符號垦垂,encodeURI() 函數(shù)是不會進行轉義的:;/?:@&=+$,#
var d = encodeURIComponent(str);
console.log(d)
結果:http%3A%2F%2Fwww.baidu.com%2Fdo%2Fs%3Fword%3D%E7%99%BE%E5%BA%A6%26ct%3D21
返回一個URLstring的副本,其中的某些字符將被16進制的轉義序列進行替換牙瓢。
該方法不會對 ASCII 字母和數(shù)字進行編碼劫拗,也不會對這些 ASCII 標點符號進行編碼: - _ . ! ~ * ' ( ) 。其他字符(比如 :;/?:@&=+$,# 這些用于分隔 URI 組件的標點符號)矾克,都是由一個或多個十六進制的轉義序列替換的页慷。
encodeURIComponent() 函數(shù) 與 encodeURI() 函數(shù)的區(qū)別之處,前者假定它的參數(shù)是 URI 的一部分(比如協(xié)議胁附、主機名酒繁、路徑或查詢字符串)。因此 encodeURIComponent() 函數(shù)將轉義用于分隔 URI 各個部分的標點符號控妻。
decodeURI
進行url跳轉時可以整體使用encodeURI
對于encodeURIComponent()轉義替換的分隔 URI 組件的符號無法進行解碼州袒。
var e = decodeURI(c);
console.log(e)
http://www.baidu.com/do/s?word=百度&ct=21
var f = decodeURI(d);
console.log(f)
結果:http%3A%2F%2Fwww.baidu.co m%2F%2Bdo%2Fs%3Fword%3D百度%26ct%3D21%23name%3D"la"
decodeURIComponent
傳遞參數(shù)時需要使用encodeURIComponent,這樣組合的url才不會被#等特殊字符截斷弓候。
var y = decodeURIComponent(d);
console.log(y)
結果:http://www.baidu.com/do/s?word=百度&ct=21
var z = decodeURIComponent(c);
console.log(z)
結果:http://www.baidu.com/do/s?word=百度&ct=21
escape()是JavaScript 1.0 時的
encodeURI() 和 encodeURIComponent()是 JavaScript 1.5 的
通過對三個函數(shù)的分析郎哭,我們可以知道:escape()除了 ASCII 字母他匪、數(shù)字和特定的符號外,對傳進來的字符串全部進行轉義編碼夸研,因此如果想對URL編碼邦蜜,最好不要使用此方法。而encodeURI() 用于編碼整個URI,因為URI中的合法字符都不會被編碼轉換亥至。ncodeURIComponent方法在編碼單個URIComponent(指請求參數(shù))應當是最常用的悼沈,它可以講參數(shù)中的中文、特殊字符進行轉義姐扮,而不會影響整個URL井辆。
// 參考一下就算了
escape對0-255以外的unicode值進行編碼時輸出%u****格式,其它情況下escape溶握,encodeURI杯缺,encodeURIComponent編碼結果相同。最多使用的應為encodeURIComponent睡榆,它是將中文萍肆、韓文等特殊字符轉換成utf-8格式的url編碼,所以如果給后臺傳遞參數(shù)需要使用encodeURIComponent時需要后臺解碼對utf-8支持(form中的編碼方式和當前頁面編碼方式相同)