URI編碼解碼和base64


概述

對於uri的編解碼,在js中有3對函數,分別是escape/unescape,encodeURI/decodeURI,encodeURIComponent/decodeURIComponent。

它們的適用范圍不同,而且遵循的編碼規范也不同。

對於上述函數而言,所有的ASCII的字符編碼相同,采用%XX的形式。而對於unicode字符,escape編碼形式為%uXXXX,而其余兩個函數則先將unicode字符按照utf-8對其進行編碼,然后繼續進行uri編碼(百分號)。對於中文字符,每個字符用urf-8編碼則為3個字節,然后在每個字節前面加上%即可。如:‘中國’按照urf-8編碼為"0xE40xB80xAD0xE50x9B0xBD",進而對該6個字節進行百分號編碼:"%E4%B8%AD%E5%9B%BD"。

 

 對於base64編碼,常常在網絡中用於編碼長標識符。編碼規則是每3個8位字節為一組,分成4組6位字節,並且每個字節的高位補零,形成4個8位的字節。base64編碼具有可逆性。在js中,IE10以及w3c瀏覽器內置了window.btoa()來完成二進制數據或者ASCII字符到base64的轉換。但是unicode字符不能使用該函數。

區別

這三對函數的安全字符(即不需要編碼的字符)范圍也不同,如下所示:

  • escape(69個):*/@+-._0-9a-zA-Z
  • encodeURI(82個):!#$&'()*+,/:;=?@-._~0-9a-zA-Z
  • encodeURIComponent(71個):!'()*-._~0-9a-zA-Z

現在對比encodeURI和encodeURIComponent,從名稱上可看出encodeURI是針對整個URI進行編碼,我們以特殊的URI--URL來說明下。

對於URL為http://www.baidu.com而言,如果用encodeURI編碼,返回的仍是“http://www.baidu.com”;如果用encodeURIComponent編碼,返回的為"http%3A%2F%2Fwww.baidu.com"。

 

encodeURI所針對的是整個URI,並不會對分隔符如/,?,=符號進行編碼,否則破壞了URI的原有含義,而encodeURIComponent則是針對URI的

某一部分進行編碼,如查詢字符串部分的&會被轉義。

base64編碼與btoa

在瀏覽器內部,encodeURIComponent(s) = escape(unicodeToUTF8(s));

根據上述公式,可以推出 unicodeToUTF8(s) = unescape(encodeURIComponent(s));然后根據utf-8編碼的字符進行base64編碼。

  function unicodeToBase64(s){

    return window.btoa(unescape(encodeURIComponent(s)))

  }

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM