天天看點

URLencode 特殊字元 轉義 遇上的坑

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

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

  如圖所示

URLencode 特殊字元 轉義 遇上的坑

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

見下方代碼:

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

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

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

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

在 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(異常):是程式本身可以處理的異常。見圖:

URLencode 特殊字元 轉義 遇上的坑

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

常見的比如:

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

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

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

下表中列出了一些URL特殊符号及編碼。

URLencode 特殊字元 轉義 遇上的坑

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

替換代碼為:

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

繼續閱讀