1. 程式人生 > >URI 中特殊字元處理

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")