URI 中特殊字元處理
一、問題闡述
今天寫 url 請求時,不管是get 請求還是 post 請求,如果引數中帶有 + % # 等特殊符號,就無法正常獲得引數
具體現象就是 用URL傳引數的時候,用&符號連線,如果某一個引數中含"#$ ^ & * + ="這些符號的時候,在另一個頁面getParameter就會取不到傳過來的引數。
二、解決方法
有些符號在URL中是不能直接傳遞的,如果要在URL中傳遞這些特殊符號,那麼就要使用他們的編碼了
1)下面列出了一些URL特殊符號及編碼十六進位制值
- + URL 中+號表示空格 %2B
- 空格 URL中的空格可以用+號或者編碼 %20
- / 分隔目錄和子目錄 %2F
- ? 分隔實際的 URL 和引數 %3F
- % 指定特殊字元 %25
- # 表示書籤 %23
- & URL 中指定的引數間的分隔符 %26
- = URL 中指定引數的值 %3D
2)java 實現
如果程式碼採用java 來訪問請求的話,可以採用 URLEncoder.encode(param,"utf-8") 將引數值編碼,對應的解碼方法為URLEncoder.decode()
java.net.URLEncoder.encode(String s)和java.net.URLDecoder.decode(String s);
比如
?1 |
String str =
"http://localhost:8980/select?param="
+ URLEncoder.encode( "bcpuser$userid$1#3#4"
,
"utf-8"
) ; <br>//得到結果 http://localhost:
8980
/BCPClientServer/select?param=bcpuser%24userid%
241
%
233
%
234
|
得到url 可以直接在瀏覽器上訪問,如果後臺採用的java+ springMVC,可以直接得到預期的引數(無需再次解碼的)
3)C# 實現
C#中編碼的主要方法:HttpUtility.UrlEncode (不推薦)、Server.UrlEncode (不推薦)、Uri.EscapeUriString、Uri.EscapeDataString。(更多詳情,看參考)
?1 2 |
String str =
"http://localhost:8980/select?param="
+ Uri.EscapeDataString(
"bcpuser$userid$1#3#4"
);
//得到結果 http://localhost:8980/BCPClientServer/select?param=bcpuser%24userid%241%233%234
|
4) javascript 實現方法
javascript中的編碼有三種方法:escape (不推薦,對ASCII符號正確編碼)、encodeURI、encodeURIComponent
encodeURI:用於對網址編碼(不包含引數)
encodeURI不編碼字元有82個:!,#,$,&,',(,),*,+,,,-,.,/,:,;,=,?,@,_,~,0-9,a-z,A-Z
encodeURI就是為這個而設計的。encodeURI不對URI中的特殊字元進行編碼,如冒號(:)、斜槓(/)。下面看個示例:
?1 2 |
encodeURI(
"http://www.cnblogs.com/a file with spaces.html"
)
// outputs http://www.cnblogs.com/a%20file%20with%20spaces.html
|
可以看到僅僅把空格替換成了20%,所以此方法可用於對網址進行編碼。
由於encodeURI不對冒號(:)、斜槓(/)進行編碼,所以如果引數(如把網址作為引數)中包含冒號(:)、斜槓(/),就會解析出錯,所以此方法不能對引數進行編碼。
encodeURIComponent:用於對網址引數進行編碼
encodeURIComponent不編碼字元有71個:!, ',(,),*,-,.,_,~,0-9,a-z,A-Z
可以看到此方法對:/都進行了編碼,所以不能用它來對網址進行編碼。由於此方法對中文,空格,井號(#),斜線(/),冒號(:)都進行了編碼,所以適合對URI中的引數進行編碼。看下面的示例:
?1 2 3 |
var param=
"部落格園"
;
var url=
"http://www.cnblogs.com/?key="
+encodeURIComponent(param)+
"&page=1"
;
console.log(url);
//outputs http://www.cnblogs.com/?key=%E5%8D%9A%E5%AE%A2%E5%9B%AD&page=1
|
三、總結
這裡我並沒有寫的很詳細,只是達到了我的目的,故暫時記錄這麼多。
因為問題出現傳遞的引數裡包含特殊符號而導致引數獲取錯誤,故這裡在url 拼接引數的時候,將引數的值編碼後傳遞即可(原理如此,不限語言)
參考部落格:http://www.cnblogs.com/kissdodog/archive/2013/04/22/3035907.html
,"utf-8")
一、問題闡述
今天寫 url 請求時,不管是get 請求還是 post 請求,如果引數中帶有 + % # 等特殊符號,就無法正常獲得引數
具體現象就是 用URL傳引數的時候,用&符號連線,如果某一個引數中含"#$ ^ & * + ="這些符號的時候,在另一個頁面getParameter就會取不到傳過來的引數。
二、解決方法
有些符號在URL中是不能直接傳遞的,如果要在URL中傳遞這些特殊符號,那麼就要使用他們的編碼了
1)下面列出了一些URL特殊符號及編碼十六進位制值
- + URL 中+號表示空格 %2B
- 空格 URL中的空格可以用+號或者編碼 %20
- / 分隔目錄和子目錄 %2F
- ? 分隔實際的 URL 和引數 %3F
- % 指定特殊字元 %25
- # 表示書籤 %23
- & URL 中指定的引數間的分隔符 %26
- = URL 中指定引數的值 %3D
2)java 實現
如果程式碼採用java 來訪問請求的話,可以採用 URLEncoder.encode(param,"utf-8") 將引數值編碼,對應的解碼方法為URLEncoder.decode()
java.net.URLEncoder.encode(String s)和java.net.URLDecoder.decode(String s);
比如
?1 |
String str =
"http://localhost:8980/select?param="
+ URLEncoder.encode(
"bcpuser$userid$1#3#4"
,
"utf-8"
) ; <br>//得到結果 http://localhost:
8980
/BCPClientServer/select?param=bcpuser%24userid%
241
%
233
%
234
|
得到url 可以直接在瀏覽器上訪問,如果後臺採用的java+ springMVC,可以直接得到預期的引數(無需再次解碼的)
3)C# 實現
C#中編碼的主要方法:HttpUtility.UrlEncode (不推薦)、Server.UrlEncode (不推薦)、Uri.EscapeUriString、Uri.EscapeDataString。(更多詳情,看參考)
?1 2 |
String str =
"http://localhost:8980/select?param="
+ Uri.EscapeDataString(
"bcpuser$userid$1#3#4"
);
//得到結果 http://localhost:8980/BCPClientServer/select?param=bcpuser%24userid%241%233%234
|
4) javascript 實現方法
javascript中的編碼有三種方法:escape (不推薦,對ASCII符號正確編碼)、encodeURI、encodeURIComponent
encodeURI:用於對網址編碼(不包含引數)
encodeURI不編碼字元有82個:!,#,$,&,',(,),*,+,,,-,.,/,:,;,=,?,@,_,~,0-9,a-z,A-Z
encodeURI就是為這個而設計的。encodeURI不對URI中的特殊字元進行編碼,如冒號(:)、斜槓(/)。下面看個示例:
?1 2 |
encodeURI(
"http://www.cnblogs.com/a file with spaces.html"
)
// outputs http://www.cnblogs.com/a%20file%20with%20spaces.html
|
可以看到僅僅把空格替換成了20%,所以此方法可用於對網址進行編碼。
由於encodeURI不對冒號(:)、斜槓(/)進行編碼,所以如果引數(如把網址作為引數)中包含冒號(:)、斜槓(/),就會解析出錯,所以此方法不能對引數進行編碼。
encodeURIComponent:用於對網址引數進行編碼
encodeURIComponent不編碼字元有71個:!, ',(,),*,-,.,_,~,0-9,a-z,A-Z
可以看到此方法對:/都進行了編碼,所以不能用它來對網址進行編碼。由於此方法對中文,空格,井號(#),斜線(/),冒號(:)都進行了編碼,所以適合對URI中的引數進行編碼。看下面的示例:
?1 2 3 |
var param=
"部落格園"
;
var url=
"http://www.cnblogs.com/?key="
+encodeURIComponent(param)+
"&page=1"
;
console.log(url);
//outputs http://www.cnblogs.com/?key=%E5%8D%9A%E5%AE%A2%E5%9B%AD&page=1
|
三、總結
這裡我並沒有寫的很詳細,只是達到了我的目的,故暫時記錄這麼多。
因為問題出現傳遞的引數裡包含特殊符號而導致引數獲取錯誤,故這裡在url 拼接引數的時候,將引數的值編碼後傳遞即可(原理如此,不限語言)
參考部落格:http://www.cnblogs.com/kissdodog/archive/2013/04/22/3035907.html
,"utf-8")