js 編碼解碼 encodeURI,encodeURIComponent,decodeURI,decodeURIComponent,escape,unescape區別

1.概念理解

1.encodeURI,encodeURIComponent是對字符進行編碼(它們是一對)。
2.decodeURI,decodeURIComponent是對編碼過的字符進行解碼(它們是一對)。
3.encodeURI,encodeURIComponent不會對 ASCII 字母和數字進行編碼和解碼,也不會對這些 ASCII 標點符號進行編碼和解碼,比如(!,",#,$,%,&,’,(),*,+,-,/,:,;,@,<,>,=,等…)。
4.encodeURIComponent,decodeURIComponent可以編碼和解碼除了非轉字符和十進制數字的其他所有字符進行編碼解碼。

2.用法

平時我們用的最多的就是對url地址進行編碼,一個url可能會包含5中類型:
1.上面說額保留字(; , / ,逗號,?,:,&,@,=,+,$,)
2.非轉義字符(52個字母=26個大小寫英文字母),十進制數字,還有標記符( - ,_, .,! ,~ ,* ,’, ( )),這種字符上面4種都編碼和解碼不了。
3.#,它不會被編碼,不屬於保留字也不屬性非轉義字符
4.上面沒有說到的字符,encodeURI只能編碼這種,decodeURI也只能解碼這種
5.被轉義成爲十六進制的字符(0-9對應0-9;A-F對應10-15)

下面我拿個例子來說吧,就比如我現在這篇博客的地址 : “https://mp.csdn.net/mdeditor/102756956”,哎呀都是非轉義字符。還是改下吧 " https://mp.csdn.net/mdeditor/102756956?propertyModelId=1854008&&a=1# ",

		var a ="https://mp.csdn.net/mdeditor/102756956?propertyModelId=1854008&&a=1";
		var b = encodeURI(a);
		var c = encodeURIComponent(a);
		console.log(b);//https://mp.csdn.net/mdeditor/102756956?propertyModelId=1854008&&a=1
	console.log(c);//https%3A%2F%2Fmp.csdn.net%2Fmdeditor%2F102756956%3FpropertyModelId%3D1854008%26%26a%3D1
		var b1 = decodeURI(b);
		var c1= decodeURIComponent(c);
		console.log(b1,c1);//https://mp.csdn.net/mdeditor/102756956?propertyModelId=1854008&&a=1

這裏需要注意的是decodeURIComponent能夠解碼encodeURI編碼的字符,而decodeURI不能解碼encodeURIComponent編碼的字符。所以最好不要搞混了,什麼編碼就用什麼解碼,下面我們來分析下地址的字符:
1.https,mp,csdn,net,mdeditor,propertyModelId,a爲非轉義字符
2.102756956,1854008,1爲十進制數字
3.地址中間的點爲標記符
4.:,/,?,=,&爲保留字
所以encodeURIComponent除非了上述的第2點不能編碼外,其他都能編碼,decodeURIComponent解碼也是一樣,傳遞參數時需要使用encodeURIComponent,這樣組合的url纔不會被特殊字符截斷,實際項目中我們一般需要get請求的方式在地址欄中拼接一些參數,但是參數中如果出現保留字或者# 這樣字符,就必須要用decodeURIComponent了,不然這些特殊字符會導致我們接收參數的錯誤。

3.儘量避免使用escape和unescape方法(請勿unescape用於解碼URI)

儘管 unescape() 未嚴格棄用(如“從Web標準中刪除”),但它 在ECMA-262標準的附件B中定義 ,其介紹指出:本附件中指定的所有語言功能和行爲都具有一個或多個不良特徵,如果沒有遺留用法,則將從本規範中刪除。在編寫新的ECMAScript代碼時,程序員不應使用或假定這些功能和行爲的存在。
其實escape類似encodeURI,unescape類似decodeURI,這裏就不多說了。

結論:encodeURIComponent編碼和decodeURIComponent解碼用的比較多,url帶有中文或者特殊字符的時候進行編碼,可以防止亂碼,實際項目中我們一般需要get請求的方式在地址欄中拼接一些參數,但是參數中如果出現保留字或者#這些特殊字符,就必須要用decodeURIComponent了,不然這些特殊字符會導致我們接收參數的錯誤。

好了說到這裏都已經說的差不多了,有不正的地方請指正,不勝感激!!歡樂的時光總是過得特別快,又到時候和大家講拜拜!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章