JS中為什麼會存在escape、encodeURI和encodeURIComponent方法
1.為什麼需要以上三個方法?
當我們瀏覽網頁的時候看,會在瀏覽器的位址列輸入相應的URL地址,然而對於URL中的可以出現的字元是有要求的。
對於URL中的可以出現的字元要求可詳見RFC 1738,具體為以下內容:
Thus, only alphanumerics, the special characters "$-_.+!*'(),", and
reserved characters used for their reserved purposes may be used
unencoded within a URL.
翻譯:因此,只有26個英文字母(包含大小寫)和10個數字,以及一些特殊字元"$ - _ . + ! * ' ( ) ,",不包含雙引號,和一些其他的保留字元可以在URL中不經過編碼而直接使用。現在我們開始進入正題,為什麼需要以上三個方法呢?
原因很簡單,就是要將那些需要出現在URL中但是不符合URL標準的字元替換為RFC 1738中允許的字元,即轉換為合法字元。眾所周知,現在的瀏覽器非常的智慧,它會替使用者完成很多操作,其中之一就是將URL中的不合法的字元轉換為合法字元。
那既然瀏覽器幫我們做了,為什麼還需要這三個方法呢?
之所以出現此問題是因為並沒有規定說URL中的中文必須轉化為何種編碼,所以有的瀏覽器會將URL中出現的中文轉化為gb2312,有的會轉為utf-8。有的是按照瀏覽器設定的編碼,有的是按照其所使用的作業系統的字元編碼,由於出現了不確定性,所以當我們需要在後臺讀取URL中的中文時,可能就會出現編碼對應不上,也就無法正確解碼得到相應的中文引數。
那怎麼消除這種不確定性呢?
一個比較好的方法是在瀏覽器對URL編碼之前手動的對URL進行編碼,手動編碼後的URL已經符合RFC 1783規範,也就是編碼後的URL中的不合法字元已經被轉化了合法字元,這樣即使瀏覽器再自動對URL編碼一次,編碼後的URL與手動編碼後的URL是一樣的。這樣無論採用gb2312還是utf-8,我們都可以控制(因為是我們自己編的碼),只要在後臺採用對應的解碼方法,即可得到正確的中文引數。
2.escape、encodeURI和encodeURIComponent的具體功能是什麼?
如果想知道javascript中的某些方法的具體功能,建議參見《javascript權威指南》中的相應章節,其描述應該是最清晰、全面和正確的。
3.三個方法的使用情況有哪些?
如果想知道javascript中的某些方法的具體功能,建議參見《javascript權威指南》中的相應章節,其描述應該是最清晰、全面和正確的。
擴充套件知識:通過1我們知道了為什麼會有這三個方法,其根本原因在於RFC1738對URL中可以出現的字元進行了限制,但是為什麼要進行這些限制呢?原因是消除潛在的不安全因素,什麼叫不安全因素,舉個例子,如果允許URL中允許出現空格,則在一些語言處理URL的時候可能會對空格進行忽略,這樣便會影響URL的正常解析,即可能出現不安全因素,為此URL對一些字元進行了限制,關於具體被限制的字元有哪些,和限制原因,可以閱讀RFC1738文件http://www.w3.org/Addressing/rfc1738.txt,裡面有一節進行了專門的講解。
參考連結:
[1] 阮一峰, 關於URL編碼, http://www.ruanyifeng.com/blog/2010/02/url_encoding.html
[2] 線上RFC1738文件, http://www.rfc-editor.org/rfc/rfc1738.txt
[3] 《javascript權威指南》