在APP開發過程中,免不了要進行ios的數據處理,在ios傳遞數據的過程中,會出現JSON數據獲取不到的情況,這時候就輪到encodeURI 和 decodeURI出馬了。 ...
在APP開發過程中,免不了要進行ios的數據處理,在ios傳遞數據的過程中,會出現JSON數據獲取不到的情況,這時候就輪到encodeURI 和 decodeURI出馬了。
1、encodeURI,decodeURI
encodeURI:將字元串作為 URI 進行編碼
- 不會對 ASCII 字母和數字進行編碼,也不會對這些 ASCII 標點符號進行編碼( 即:- _ . ! ~ * ' ( ) )。
- 目的是對 URI 全部的編碼,因此對在 URI 中具有特殊含義的 ASCII 標點符號(即:;/?:@&=+$,#)是不會進行編碼的。所以,此函數別名為 encodeURL 不為過,相當於 PHP 的 url_encode 。
例子:
encodeURI("http://ydr.me?user=hello 雲淡然");
// "http://ydr.me?user=hello%20%E4%BA%91%E6%B7%A1%E7%84%B6"
decodeURI("http://ydr.me?user=hello%20%E4%BA%91%E6%B7%A1%E7%84%B6");
// http://ydr.me?user=hello 雲淡然
由於 encodeURI 是對 URL 的完整編碼,所以常用於URL的跳轉之處:
location.href=encodeURI('http://baidu.com/s?word=hello 雲淡然');
// "http://baidu.com/s?word=hello%20%E4%BA%91%E6%B7%A1%E7%84%B6"
在各個瀏覽器打開該地址,表現均不相同:
- ie的url表現的最規範(完全按照encodeURI編碼)
- chrome的url表現比較規範(部分按照encodeURI編碼)
- firefox的url表現最不規範(完全沒有安裝encodeURI編碼)
雖然各個瀏覽器的URL表現均不相同,但在 firefox 和 chrome 中url的可讀性最高,ie最低。
2、encodeURIComponent 和 decodeURIComponent
encodeURI 是對完整的URL進行編碼,而 encodeURIComponent 是對URL的參數進行編碼的,並且其編碼特點如下:
- 不會對 ASCII 字母和數字進行編碼,也不會對這些 ASCII 標點符號進行編碼(即: - _ . ! ~ * ' ( ) )。
- 目的是對 URI 部分的編碼,因此對在 URI 中具有特殊含義的 ASCII 標點符號(即:;/?:@&=+$,#)是會進行編碼的。
encodeURIComponent("http://ydr.me?user=hello world");
// "http%3A%2F%2Fydr.me%3Fuser%3Dhello%20world"
decodeURIComponent("http%3A%2F%2Fydr.me%3Fuser%3Dhello%20world");
// http://ydr.me?user=hello world
由於 encodeURIComponent 是對URL部分編碼,因此常用於queryString、hashSearch、hashPath以及Cookie中,如:
// queryString 編碼
"http://ydr.me?from=" + encodeURIComponent("http://baidu.com");
// "http://ydr.me?from=http%3A%2F%2Fbaidu.com"
// hashSearch、hashPath 編碼
"http://ydr.me#?from=" + encodeURIComponent("http://baidu.com");
// "http://ydr.me#?from=http%3A%2F%2Fbaidu.com"
"http://ydr.me#!from/" + encodeURIComponent("http://baidu.com");
// "http://ydr.me#!from/http%3A%2F%2Fbaidu.com"
// cookie 編碼
document.cookie = "from=" + encodeURIComponent("http://baidu.com");
// "from=http%3A%2F%2Fbaidu.com"
3、escape 和 unescape
escape 與 encodeURI 和 encodeURIComponent 類似,都是對字元串進行編碼。不同點在於該方法不會對 ASCII 字母和數字進行編碼,也不會對這些 ASCII 標點符號(即: * @ - _ + . / )進行編碼,其他所有的字元都會被轉義序列替換。
註意:ECMAScript v3 反對使用該方法,應用使用 decodeURI() 和 decodeURIComponent() 替代它。