天天看點

Java中URLDecoder的編碼問題

java.net.URLDecoder.decode

  在項目中碰到了個比較奇怪的問題,就是我在本地使用java.net.URLDecoder.decode(ruleName)方法解碼,沒有問題,本地的頁面也可以正常打開。但是當我把代碼移植到測試環境中去的時候,卻打不開頁面,檢視背景日志也沒有報錯資訊。

  本地環境用的JDK1.6,tomcat用的7,測試環境JDK1.6 tomcat版本不明确

就納悶了,因為這個方法已經提示過時了,就在考慮是不是這個問題導緻的,應該有可以替代的方法,然後就去檢視了下JDK的API,如下

  試着将代碼中的java.net.URLDecoder.decode(ruleName)修改為java.net.URLDecoder.decode(ruleName, "UTF-8");然後編譯,替換測試環境的代碼,發現問題解決了。

  這應該就是JDK中有些過時的代碼在低版本的tomcat中可能失效了,是以大家在以後的程式設計中一定要盡量避免過時方法的使用,以規避不必要的問題。

案例2:

和基友一起撸Java Web,基友負責前端我負責後端。前端用jQuery與後端互動,參數和響應全部用JSON傳。在傳參數的時候JSON字元串肯定會被URL Encode,在後端要進行URL Decode之後才能解析。一開始用的是URLDecoder解析:

[java] 

view plain

 copy

  1. return URLDecoder.decode(str);  

之後發現中文全都是亂碼……很尴尬。一開始以為是浏覽器發送的資料的編碼和Java預設的編碼不一樣,于是各種轉換編碼,還是跪了。判斷了一下編碼,發現本來就是UTF-8,但列印出來還是亂碼。後來把字元串按位元組列印出來,發現中文部分和URL Encode之後的那部分字元串完全吻合,之前也看到有人用URL Encode然後Decode解決了中文亂碼問題,才意識到是URL Decode出了問題。其實URLDecoder.decode(String) 這個方法是deprecated的,加上指定文本編碼的參數,亂碼問題解決:

  1. return URLDecoder.decode(str, "UTF-8");  

看來以後還是不要用deprecated方法……廢棄一定是有原因的orz

  1. public static String getEncoding(String str) {        
  2.         String[] encode = {  
  3.                 "GB2312", "ISO-8859-1", "UTF-8", "GBK"  
  4.         };  
  5.         for(int i = 0; i < encode.length; i++) {  
  6.             try {  
  7.                 if(str.equals(new String(str.getBytes(encode[i]), encode[i]))) {  
  8.                     return encode[i];  
  9.                 }  
  10.             } catch (UnsupportedEncodingException e) {  
  11.             }  
  12.         }  
  13.         return "";  
  14.     }  

繼續閱讀