encodeURI和encodeURIComponet函數都是javascript中用來對URI進行編碼,將相關參數轉換成UTF-8編碼格式的資料。 URI在進行定位跳轉時,參數裡面的中文、日文等非ASCII編碼都會進行編碼轉換。
這兩個函數函數上面比較接近,但是有些差異。
encodeURI:不會進行編碼的字元有82個:!,#,$,&,',(,),*, ,,,-,.,/,:,;,=,?,@, _,~,0-9,a-z,A-Z
encodeURIComponent:不會進行編碼的字元有71個:!, ',(,),*,-,.,_,~,0-9,a-z,A-Z
問題:
ajax.get ( url '?k1'=v1 '&k2'=v2 '&k3'=v3, ... );
由於URL只進行了encodeURI編碼,所以想提交的參數有searchWord = a b時,變成了a b。
解決方法:
ajax.post( url, params,....)
其中params是物件。
原因:如果參數是物件或陣列時,元件庫已經幫你進行encodeURIComponent了。 而如果你只是字串,元件庫就什麼也沒做,所以到後端時就把特殊字元給過濾了。
encodeURI()用法
此方法不會對 ASCII 字母和數字進行編碼,也不會對這些 ASCII 標點符號進行編碼: - _ . ! ~ * ' ( ) 。
此方法的目的是對URI 進行完整的編碼,因此對以下在URI 中具有特殊意義的ASCII 標點符號,encodeURI() 函數是不會進行轉義的:;/?:@&= $, #
提示:如果 URI 元件中含有分隔符,例如 ? 和 #,則應使用 encodeURIComponent() 方法分別對各元件進行編碼。
範例:
document.write(encodeURI("http://www.w3school.com.cn")+ "<br />") document.write(encodeURI("http://www.w3school.com.cn/My first/")) document.write(encodeURI(",/?:@&=+$#")) //批注:只转换域名后面的部分,并且对,/?:@&=+$#不处理。 // http://www.w3school.com.cn // http://www.w3school.com.cn/My%20first/ // ,/?:@&=+$#
decodeURI() 函數可對 encodeURI() 函數編碼過的 URI 進行解碼。
encodeURIComponent()用法
此方法不會對 ASCII 字母和數字進行編碼,也不會對這些 ASCII 標點符號進行編碼: - _ . ! ~ * ' ( ) 。
其他字元(例如 :;/?:@&= $,# 這些用來分隔 URI 元件的標點符號),都是由一個或多個十六進位的轉義序列取代的。
提示:請注意 encodeURIComponent() 函數 與 encodeURI() 函數的區別之處,前者假定它的參數是 URI 的一部分(例如協定、主機名稱、路徑或查詢字串)。因此 encodeURIComponent() 函數將轉義用於分隔 URI 各部分的標點符號。
範例:
document.write(encodeURIComponent("http://www.w3school.com.cn")) document.write(encodeURIComponent("http://www.w3school.com.cn/p 1/")) document.write(encodeURIComponent(",/?:@&=+$#")) //对比 // http%3A%2F%2Fwww.w3school.com.cn // http%3A%2F%2Fwww.w3school.com.cn%2Fp%201%2F // %2C%2F%3F%3A%40%26%3D%2B%24%23
decodeURIComponent() 函式可對 encodeURIComponent() 函式編碼的 URI 進行解碼。