获取相册所有uri_URI转码
一、 encodeURI來解決URL傳遞時的中文問題
1.前端:
var url = baseContext+"xxxx.action?parm="+encodeURI(encodeURI('中'));2.后端:
String supName = request.getParameter("parm"); supName = URLDecoder.decode(supName, "UTF-8");二、特殊字符在傳輸過程中被轉(zhuǎn)義編碼( %+ASCII(16進(jìn)制)碼值 )
有些符號在URL中是不能直接傳遞的,如果要在URL中傳遞這些特殊符號,那么就要使用他們的編碼了。編碼的格式為:%加字符的ASCII碼,即一個百分號%,后面跟對應(yīng)字符的ASCII(16進(jìn)制)碼值。例如 空格的編碼值是"%20"。
如果不使用轉(zhuǎn)義字符,這些編碼就會當(dāng)URL中定義的特殊字符處理。
開發(fā)時有時服務(wù)端返回的json中包含url,url中可能含有一些特殊字符,這些特殊字符在傳輸?shù)倪^程中可能會被轉(zhuǎn)義成編碼。這時候我們拿到手里要如何轉(zhuǎn)換回去呢,先看下那些字符可能會被編碼
三、
做頁面開發(fā)的時候有時候,會使用Javascript的escape(),encodeURIComponent(),encodeURI ()這三個函數(shù)進(jìn)行URL編碼,防止特殊字符接收不到。
1.使用encodeURLComponent傳遞參數(shù)
function URLencode(sStr) {sStr = escape(escape(sStr));location.href="http://passport.baidu.com/?logout&aid=7&u='+encodeURIComponent("http://cang.baidu.com/bruce42")+);}2. 進(jìn)行URL跳轉(zhuǎn)的時候整體使用encodeURL
function URLencode(sStr) {Location.href=encodeURI("http://cang.baidu.com/do/s?word=京東&ct=21"); }3.js使用數(shù)據(jù)時可以用escape(個人用的比較多)編碼功能比較強(qiáng)大
Javascript中的escape()是將中文按ISO-8859-1字符集進(jìn)行URL編碼的,那樣通過 request.getParameter()是能直接獲取到請求參數(shù)的,但后來的Javascript將escape()換成了Unicode字符集編 碼,如此一來,在JSP和Servlet中就沒法直接拿到請求參數(shù)了,而且此時的request獲得的參數(shù)值都是空值,
四、
總結(jié):URL編碼轉(zhuǎn)換函數(shù):
escape() 不常用
encodeURI() 對整體URL編碼 常用 不編碼! @ # $ & ( ) = : / ; ? + 等符號
encodeURIComponent() 這種串不建議使用此編碼http://www.oschina.net/search?scope=bbs
2. encodeURI(): 把URI字符串采用UTF-8編碼格式轉(zhuǎn)化成escape格式的字符串。不會被此方法編碼的字符:! @ # $ & ( ) = : / ; ? + ',反向編碼函數(shù):decodeURI()。
var str1 = encodeURI('http://www.oschina.net/search?scope=bbs&q=C語言') str1 //"http://www.oschina.net/search?scope=bbs&q=C%E8%AF%AD%E8%A8%80" decodeURI(str1) //"http://www.oschina.net/search?scope=bbs&q=C語言"3. encodeURIComponent():把URI字符串采用URF-8編碼格式轉(zhuǎn)化成escape格式的字符串。與encodeURI相比,這個函數(shù)會將更多的字符進(jìn)行編碼,比如"/"等字符。所以如果字符串里面包含了URI的幾個部分的話,不能用這個來進(jìn)行編碼。否則“/”字符被編碼后將URL顯示錯誤。不會被此方法編碼的字符:! * ( ),反向編碼函數(shù):decodeURIComponent()。
encodeURIComponent('1@2') "1%402" decodeURIComponent("1%402") "1@2".
TIPS: 瀏覽器不會自動轉(zhuǎn)碼
3. 多次編碼,多次轉(zhuǎn)碼 涉及到用戶名時
decodeURIComponent(decodeURIComponent(decodeURIComponent('jinyifan%252020321'))) "jinyifan 20321" decodeURIComponent(decodeURIComponent('jinyifan%252020321')) "jinyifan 20321" decodeURIComponent('jinyifan%252020321') "jinyifan%2020321"解碼多次一個不帶%25(這是 %號的編碼)的串時,多次解碼結(jié)果是一樣的。
decodeURIComponent('jinyifan%20321') "jinyifan 321" decodeURIComponent(decodeURIComponent('jinyifan%20321')) "jinyifan 321" decodeURIComponent(decodeURIComponent(decodeURIComponent('jinyifan%20321'))) "jinyifan 321"編碼多次一個帶空格的串 是會產(chǎn)生大量的%25的
encodeURIComponent('jinyifan 321') "jinyifan%20321" encodeURIComponent(encodeURIComponent('jinyifan 321') ) "jinyifan%2520321" encodeURIComponent(encodeURIComponent(encodeURIComponent('jinyifan 321') )) "jinyifan%252520321" encodeURIComponent(encodeURIComponent(encodeURIComponent(encodeURIComponent('jinyifan 321') ))) "jinyifan%25252520321"前端給后端傳用戶名串時,編碼幾次合理?
注意:
在前端與后端傳遞數(shù)據(jù)時,會遇到這樣一個問題,如果傳遞的字符串中含有特殊字符
如:+ 空格/ ? % & = #
如果不進(jìn)行特殊處理,會發(fā)生數(shù)據(jù)丟失的現(xiàn)象。
例如:我在前端傳入后端"aVUAAAACS+uJkta7" 但是后端接收的時候接收到的是
"aVUAAAACS uJkta7" ,特殊字符“+”丟失了。
解決的辦法就是:
前端在傳遞之前,檢查一下是否有特殊字符,如果有,進(jìn)行一下轉(zhuǎn)換編碼操作。
例如:前端部分
var id="aVUAAAACS+uJkta7"; id = encodeURIComponent(encodeURIComponent(id));后端在接收字符串時,檢查是否有編碼的形式,如果有,進(jìn)行解碼。這樣就完成了特殊字符的傳遞。
后端部分:
String id = pd.getString("id");//獲取id id = java.net.URLDecoder.decode(id,"UTF-8");//特殊字符解碼這樣id就成功完整地由前端傳入后端了。
——————————————————————————————————————
decodeURI與decodeURIComponent區(qū)別
1. 概念:
URI: Uniform ResourceIdentifiers,通用資源標(biāo)識符
Global對象的encodeURI()和encodeURIComponent()方法可以對URI進(jìn)行編碼,以便發(fā)送給瀏覽器。有效的URI中不能包含某些字符,例如空格。而這URI編碼方法就可以對URI進(jìn)行編碼,它們用特殊的UTF-8編碼替換所有無效的字 符,從而讓瀏覽器能夠接受和理解。
其中encodeURI()主要用于整個URI(例如,http://www.jxbh.cn/illegal value.htm),而encode-URIComponent()主要用于對URI中的某一段(例如前面URI中的illegal value.htm)進(jìn)行編碼。它們的主要區(qū)別在于,encodeURI()不會對本身屬于URI的特殊字符進(jìn)行編碼,例如冒號、正斜杠、問號和井字號;而encodeURIComponent()則會對它發(fā)現(xiàn)的任何非標(biāo)準(zhǔn)字符進(jìn)行編碼。來看下面的例子:
var uri="http://www.jxbh.cn/illegal value.htm#start";
//”http: //http://www.jxbh.cn/illegal%20value .htm#s tart”
alert(encodeURI (uri)):
//”http% 3A%2F%2Fwww.jxbh.cn%2 Fillegal%2 0value. htm%23 start”
alert( encodaURIComponent (uri));
使用encodeURI()編碼后的結(jié)果是除了空格之外的其他字符都原封不動,只有空格被替換成了%20。而encodeURIComponent()方法則會使用對應(yīng)的編碼替換所有非字母數(shù)字字符。這也正是可以對整個URI使用encodeURI(),而只能對附加在現(xiàn)有URI后面的字符串使用encodeURIComponent()的原因所在。一般來說,我們使用encodeURIComponent()方法的時候要比使用encodeURI()更多,因為在實踐中更常見的是對查詢字符串參數(shù)而不是對基礎(chǔ)URL進(jìn)行編碼.
經(jīng)我的觀測,很多網(wǎng)站的cookie在進(jìn)行編碼的時候,是encodeURIComponent格式的,所以應(yīng)該使用decodeURIComponent()進(jìn)行解碼
總結(jié)
以上是生活随笔為你收集整理的获取相册所有uri_URI转码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 账号 linux_Linux入门之UID
- 下一篇: python 系统进程_在Python中