URLencode 特殊字符 轉義 遇上的坑


 

  在項目中遇到一個問題,在webveiw和原生之間進行傳值的時候,出現了一些encode的小問題。看起來很簡單的問題,實際上卻存在不小的坑。

  首先說一下目前項目的結構,在一個activity中,webview和原生之間有多種交互。

  如圖所示

在原生調用webview方法,這種協議已經非常常用了,直接調用loadJS();但是自定義協議這個過程,使用的攔截跳轉的方式,按照預定的協議來解析數據,這里面就有一些情況,比如數據中出現了中文,webview會encode這部分內容,這就要求我們對攔截以后的內容進行decode。

見下方代碼:

1   private String decodeUrl(String url) {
2             try {
3                 return URLDecoder.decode(url, "utf-8");
4             } catch (UnsupportedEncodingException e) {
5                 e.printStackTrace();
6             }
7             return "";
8         }

上面這段代碼,看上去是很合理的,但是老司機們認真看看,這里面有坑。

首先看一下底層代碼的decode。

   /**
     * @throws UnsupportedEncodingException if {@code     charsetName} is not supported.
     */
    public static String decode(String s, String charsetName) throws UnsupportedEncodingException {
        return UriCodec.decode(s, true, Charset.forName(charsetName), true);
    }

 

我想老司機們應該已經明白了是為啥了,就是檢查異常和運行時異常的問題了。UnsupportedEncodingException 僅僅是檢查時異常,而可能還有運行時異常,因此這里代碼需要改為:

 1 private String decodeUrl(String url) {
 2             String decodeUrl = "";
 3             try {
 4                 decodeUrl = URLDecoder.decode(url, "utf-8");
 5             } catch (Exception e) {
 6                 e.printStackTrace();
 7             } finally {
 8                 return decodeUrl;
 9             }
10         }

 

這里對異常進行簡單的介紹。

在 Java 中,所有的異常都繼承了 Throwable(可拋出)。Throwable 指定代碼中可用異常傳播機制通過 Java 應用程序傳輸的任何問題的共性。
Throwable: 有兩個重要的子類:Exception(異常)和 Error(錯誤),二者都是 Java 異常處理的重要子類,各自都包含大量子類。
Error(錯誤):是程序無法處理的錯誤,表示運行應用程序中較嚴重問題。大多數錯誤與代碼編寫者執行的操作無關,而表示代碼運行時 JVM(Java 虛擬機)出現的問題。例如,Java虛擬機運行錯誤(Virtual MachineError),當 JVM 不再有繼續執行操作所需的內存資源時,將出現 OutOfMemoryError。這些異常發生時,Java虛擬機(JVM)一般會選擇線程終止。

。這些錯誤表示故障發生於虛擬機自身、或者發生在虛擬機試圖執行應用時,如Java虛擬機運行錯誤(Virtual MachineError)、類定義錯誤(NoClassDefFoundError)等。這些錯誤是不可查的,因為它們在應用程序的控制和處理能力之 外,而且絕大多數是程序運行時不允許出現的狀況。對於設計合理的應用程序來說,即使確實發生了錯誤,本質上也不應該試圖去處理它所引起的異常狀況。在 Java中,錯誤通過Error的子類描述。

Exception(異常):是程序本身可以處理的異常。見圖:

運行時異常很常見比如 空指針、非法參數、數組越界、類轉換異常、算術異常等。這些異常需要老司機們有經驗有技巧的對待,寫代碼時動用金手指,把這些異常都捕獲住。

常見的比如:

1   String  numberStr= "1";
2 try{
3   int number = Integer.valueOf(numberStr);
4 } catch(exception e){
5 e.printStackTrace();
6 } 

上面代碼沒有檢查時異常,但是需要老司機捕獲住。

 

當然實際上這里面坑還不止這些,中文符號被decode還辦好,關鍵是一些特殊符號不好辦。

有些符號在URL中是不能直接傳遞的,如果要在URL中傳遞這些特殊符號,那么就要使用他們的編碼了。編碼的格式為:%加字符的ASCII碼,即一個百分號%,后面跟對應字符的ASCII(16進制)碼值。例如 空格的編碼值是"%20"。
下表中列出了一些URL特殊符號及編碼。

 

實際測試中發現,只要替換調%就好了。

替換代碼為:

 1  private String decodeUrl(String url) {
 2             String decodeUrl = "";
 3             try {
 4                 String transformUrl = url.replaceAll("%(?![0-9a-fA-F]{2})", "%25");
 5                 decodeUrl = URLDecoder.decode(transformUrl,"UTF-8");
 6             } catch (Exception e) {
 7                 e.printStackTrace();
 8             } finally {
 9                 LogUtil.e("my", "decodeUrl:" + decodeUrl);
10                 return decodeUrl;
11             }
12         }

 

以上代碼,通過了表格8種符號 全半角形式以及日文韓文的測試,傳值和decode都是正常的。

 

 
        

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM