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
- return URLDecoder.decode(str);
之後發現中文全都是亂碼……很尴尬。一開始以為是浏覽器發送的資料的編碼和Java預設的編碼不一樣,于是各種轉換編碼,還是跪了。判斷了一下編碼,發現本來就是UTF-8,但列印出來還是亂碼。後來把字元串按位元組列印出來,發現中文部分和URL Encode之後的那部分字元串完全吻合,之前也看到有人用URL Encode然後Decode解決了中文亂碼問題,才意識到是URL Decode出了問題。其實URLDecoder.decode(String) 這個方法是deprecated的,加上指定文本編碼的參數,亂碼問題解決:
- return URLDecoder.decode(str, "UTF-8");
看來以後還是不要用deprecated方法……廢棄一定是有原因的orz
- public static String getEncoding(String str) {
- String[] encode = {
- "GB2312", "ISO-8859-1", "UTF-8", "GBK"
- };
- for(int i = 0; i < encode.length; i++) {
- try {
- if(str.equals(new String(str.getBytes(encode[i]), encode[i]))) {
- return encode[i];
- }
- } catch (UnsupportedEncodingException e) {
- }
- }
- return "";
- }