URL encode 意識

爲什麼要對URL進行encode
URL 規範

  • 不用大寫;(強制)
  • 用中槓-不用下槓_;(強制)
  • 參數列表要encode,編碼使用utf-8;(強制)
  • URI中的名詞表示資源集合,使用複數形式。(建議)
  • 增加版本號(建議)
    url轉義其實也是爲了符合url的規範而已。因爲在標準的url規範中中文和很多的字符是不允許出現在url中的

URL 需要轉化的字符
ASCII 的控制字符
這些字符都是不可打印的,自然需要進行轉化。
一些非ASCII字符
這些字符自然是非法的字符範圍。轉化也是理所當然的了。
一些保留字符
最常見的就是“&”如果出現在url中了,那是url中的一個字符呢,還是特殊的參數分割用的呢?。
一些不安全的字符
例如:空格。爲了防止引起歧義,需要被轉化爲“+”。

註釋:通過urlencode的轉化規則和目的,知道urleocode是基於字符編碼的。同樣的一個漢字,不同的編碼類型,肯定對應不同的urleocode的串。gbk編碼的有gbk的encode結果,apache等服務器,接受到字符串後,可以進行decode,但是還是無法解決編碼的問題。編碼問題,還是需要靠約定或者字符編碼的判斷解決。

js中編碼函數:escape(),encodeURI()與encodeURIComponent()
函數出現時間:

escape()                 javascript 1.0            
encodeURI()              javascript 1.5         
encodeURIComponent()     javascript 1.5

escape():採用ISO Latin字符集對指定的字符串進行編碼。所有的空格符、標點符號、特殊字符以及其他非ASCII字符都會轉化成%xx格式的字符編碼(xx代表此字符在字符集表裏編碼的16進制數字)。比如,空格符的對應編碼是%20。不會對ASCII字符和數字進行編碼。不會被此方法編碼的字符69個:*,+,-,.,/,@,_,0-9,a-z,A-Z,此函數現在已經不提倡使用,反向編碼函數:unescape()。
例如:

escape("小明");
"%u5C0F%u660E"

encodeURI():把URI字符串採用UTF-8編碼格式轉化成escape格式的字符串。不會被此方法編碼的字符82個:!,#,$,&,’,(,),*,+,,,-,.,/,:,;,=,?,@,_,~,0-9,a-z,A-Z,反向編碼函數:decodeURI()。
例如:

encodeURI("小明");
"%E5%B0%8F%E6%98%8E"
encodeURI("http://www.example.com?name=小明");
"http://www.example.com?name=%E5%B0%8F%E6%98%8E"

encodeURIComponent():把URI字符串採用URF-8編碼格式轉化成escape格式的字符串。與encodeURI()相比,這個函數會將更多的字符進行編碼,比如"/"等字符。所以如果字符串裏面包含了URI的幾個部分的話,不能用這個來進行編碼。否則“/”字符被編碼後將URL顯示錯誤。不會被此方法編碼的字符71個:!, ',(,),*,-,.,_,~,0-9,a-z,A-Z,反向編碼函數:decodeURIComponent()。
例如:

encodeURIComponent("小明");
"%E5%B0%8F%E6%98%8E"
encodeURIComponent("http://www.example.com?name=小明");
"http%3A%2F%2Fwww.example.com%3Fname%3D%E5%B0%8F%E6%98%8E"

總結
escape()函數用於js對字符串進行編碼,不提倡使用;
encodeURI()用於整個URL跳轉;
encodeURIComponent()用於參數的傳遞。

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