encodeURIComponent() 函數可把字串作為 URI 組件進行編碼。
文法:encodeURIComponent(URIstring)
參數描述:URIstring 必需。一個字串,含有 URI 組件或其他要編碼的文本。
傳回值:URIstring 的副本,其中的某些字元將被十六進位的逸出序列進行替換。
說明:該方法不會對 ASCII 字母和數字進行編碼,也不會對這些 ASCII 標點符號進行編碼: – _ . ! ~ * ‘ ( ) 。其他字元(比如 :;/?:@&=+$,# 這些用於分隔 URI 組件的標點符號),都是由一個或多個十六進位的逸出序列替換的。
提 示:請注意 encodeURIComponent() 函數 與 encodeURI() 函數的區別之處,前者假定它的參數是 URI 的一部分(比如協議、主機名稱、路徑或查詢字串)。因此 encodeURIComponent() 函數將轉義用於分隔 URI 各個部分的標點符號。
執行個體:
在本例中,我們將使用 encodeURIComponent() 對 URI 進行編碼:
代碼如下 |
複製代碼 |
<script type="text/javascript"> document.write(encodeURIComponent("http://www.w3school.com.cn")); document.write("<br />"); document.write(encodeURIComponent("http://www.w3school.com.cn/p 1/")); document.write("<br />"); document.write(encodeURIComponent(",/?:@&=+$#")); </script> 輸出: http%3A%2F%2Fwww.111cn.net http%3A%2F%2Fwww.111cn.net%2Fp%201%2F %2C%2F%3F%3A%40%26%3D%2B%24%23 |
escape() 方法:
采 用ISO Latin字元集對指定的字串進行編碼。所有的空格符、標點符號、特殊字元以及其他非ASCII字元都將被轉化成%xx格式的字元編碼(xx等於該字元 在字元集表裡面的編碼的16進位數字)。比如,空格符對應的編碼是%20。unescape方法與此相反。不會被此方法編碼的字元: @ * / +
encodeURI() 方法:
把URI字串採用UTF-8編碼格式轉化成escape格式的字串。不會被此方法編碼的字元:! @ # $& * ( ) = : / ; ? + ‘
encodeURIComponent() 方法:
把 URI字串採用UTF-8編碼格式轉化成escape格式的字串。與encodeURI()相比,這個方法將對更多的字元進行編碼,比如 / 等字元。所以如果字串裡麵包含了URI的幾個部分的話,不能用這個方法來進行編碼,否則 / 字元被編碼之後URL將顯示錯誤。不會被此方法編碼的字元:! * ( )
因此,對於中文字串來說,如果不希望把字串編碼格式轉化成UTF-8格式的(比如原頁面和目標頁面的charset是一致的時候),只需要使用 escape。如果你的頁面是GB2312或者其他的編碼,而接受參數的頁面是UTF-8編碼的,就要採用encodeURI或者 encodeURIComponent。
另外,encodeURI/encodeURIComponent是在javascript1.5之後引進的,escape則在javascript1.0版本就有。
通過js encodeURIComponent傳到伺服器的亂碼問題
二、解決過程:(1) 在JSP中使用encodeURIComponent來進行編碼,兩次編碼:
代碼如下 |
複製代碼 |
content=encodeURIComponent(encodeURIComponent(content)); var url="${pageContext.request.contextPath}/BlogAction.do?method=doPublishBlog&content="+content; content=encodeURIComponent(encodeURIComponent(content)); var url="${pageContext.request.contextPath}/BlogAction.do?method=doPublishBlog&content="+content; |
(2) 在action中使用解碼:
Java代碼
代碼如下 |
複製代碼 |
String content=(String)request.getParameter("content"); content=URLDecoder.decode(content,"UTF-8"); String content=(String)request.getParameter("content"); content=URLDecoder.decode(content,"UTF-8"); |
這個問題得以解決。
1)js 中encodeURI 與 encodeURIComponent的區別
encodeURI 方法返回一個編碼的 URI。如果您將編碼結果傳遞給 decodeURI,那麼將返回初始的字串。encodeURI 方法不會對下列字元進行編碼:":"、"/"、";" 和 "?"。請使用 encodeURIComponent 方法對這些字元進行編碼。經過我測試“#”也屬於這個特殊字元的範疇,使用encodeURI編碼時#是不會被編碼的,所以上面情境的問題依然存在的,對於這種輸入的內容,肯定是用encodeURIComponent。
(2)IE對#的不同處理,從下面的header 內容可以看出來。
代碼如下 |
複製代碼 |
IE8: POST /dcwb/BlogAction.do?method=doPublishBlog&content=%23���Ի���%23&decorator=exclude&gridId=&gridName=&videoId=&imageId=&topicId= IE6: POST /dcwb/BlogAction.do?method=doPublishBlog&content=%23��������%20&decorator=exclude&gridId=&gridName=&videoId=&imageId=&topicId= HTTP/1.1 |
最多使用的應為encodeURIComponent,它是將中文、韓文等特殊字元轉換成utf-8格式的url編碼,所以如果給後台傳遞參數需要使用encodeURIComponent時需要後台解碼對utf-8支援(form中的編碼方式和當前頁面編碼方式相同)
escape不編碼字元有69個:*,+,-,.,/,@,_,0-9,a-z,A-Z
encodeURI不編碼字元有82個:!,#,$,&,',(,),*,+,,,-,.,/,:,;,=,?,@,_,~,0-9,a-z,A-Z
encodeURIComponent不編碼字元有71個:!, ',(,),*,-,.,_,~,0-9,a-z,A-Z