首先看一下這三個函數在js版本中出現的時間
- escape() javascript 1.0
- encodeURI() javascript 1.5
- encodeURIComponent() javascript 1.5
escape() : 採用ISO Latin字符集對指定的字符串進行編碼。所有的空格符、標點符號、特殊字符以及其他非ASCII字符都會轉化成%xx格式的字符編碼(xx代表此字符在字符集表裏編碼的16進制數字)。比如,空格符的對應編碼是%20。不會對ASCII字符和數字進行編碼。不會被此方法編碼的字符:@ * / +,反向編碼函數:unescape()。
encodeURI(): 把URI字符串採用UTF-8編碼格式轉化成escape格式的字符串。不會被此方法編碼的字符:! @ # $ & ( ) = : / ; ? + ',反向編碼函數:decodeURI()。
encodeURIComponent():把URI字符串採用URF-8編碼格式轉化成escape格式的字符串。與encodeURI相比,這個函數會將更多的字符進行編碼,比如"/"等字符。所以如果字符串裏面包含了URI的幾個部分的話,不能用這個來進行編碼。否則“/”字符被編碼後將URL顯示錯誤。不會被此方法編碼的字符:! * ( ),反向編碼函數:decodeURIComponent()。
- 然後介紹一下三個函數的使用場景:
- escape()函數用於js對字符串進行編碼。不常用
- encodeURI()用於整個url跳轉
- encodeURIComponent()用於參數的傳遞,參數包含特殊字符可能會造成間斷
然後我今天遇到一個需求,上游頁面通過url來到我的頁面後會傳遞一個加密後的參數。我需要取出來,然後傳遞給我們的服務端。但是取出來之後裏邊的一些字符就自動轉換了,比如裏邊多了一些等於號=,加號+。然後這時候我需要把取到的query再經過encodeURIComponent()函數處理一下,才能得到最開始的url中的參數的格式。然後再寫別的邏輯就沒問題了。