1. 程式人生 > >Android資料安全之URLEncoder編碼

Android資料安全之URLEncoder編碼

URLEncoder編碼

客戶端在進行網頁請求的時候,網址中可能會包含非ASCII碼形式的內容,比如中文、?、&等特殊字元。而直接把這些字元放到網址中請求是不允許的,容易和get請求的轉義符衝突,也容易出現丟失或亂碼的現象,所以需要用URLEncoder編碼地址,將網址中的非ASCII碼內容轉換成可以傳輸的字元。

編碼原理

1、將需要轉換的內容(ASCII碼形式之外的內容),用十六進位制表示法轉換出來,並在之前加上%開頭,而ASCII碼集內的字元不進行處理。

eg: 0x9c URLEncoder –> %9c

2、內容中的空格‘ ’ ,全部用+代替

3、注:與Hex不同,Hex是將所有的字元轉換為16進製表示,而URLEncoder是將ASCII碼集之外的轉換為%加上相應的16進位制。

應用場景

1、所有的GET請求

2、網址中有中文等情況

3、POST請求,所有的Key和Value在提交之前都要經過URLEncoder

程式碼實現

 @Test
    public void URLEncodeTest() {
        //位址列不允許中文,傳遞一些特殊字元 & ? ,而這些符號很容易和get提交上的轉義符號衝突
        String url = "http://www.baidu.com?search=\"中文字元\"&name=uy?&cc&pwd=?ke&w";
        //將url進行分割,對相應的字串進行URLEncode編碼,然後再拼接,最後解碼
        StringBuffer sb = new StringBuffer("http://www.baidu.com?"
); //通過URLDeCoder轉碼 String searchEncode = URLEncoder.encode("search=\"中文字元\""); System.out.println("search=\"中文字元\"--編碼後: " + searchEncode); String nameEncode = URLEncoder.encode("name=uy?&cc"); System.out.println("name=uy?&cc--編碼後: " + nameEncode); String pwdEncode = URLEncoder.encode
("pwd=?ke&w"); System.out.println("pwd=?ke&w--編碼後: " + pwdEncode); //轉碼後拼接 String encodeUrl = sb.append(searchEncode).append("&") .append(nameEncode).append("&") .append(pwdEncode).toString(); System.out.println("初始的 url=" + url); System.out.println("通過URLDeCoder轉碼 encodeUrl=" + encodeUrl); //把轉碼的url 還原 String decodeUrl = URLDecoder.decode(encodeUrl); System.out.println("通過URLDeCoder解碼 decodeUrl=" + decodeUrl); }

測試結果:

search="中文字元"--編碼後: search%3D%22%E4%B8%AD%E6%96%87%E5%AD%97%E7%AC%A6%22
name=uy?&cc--編碼後: name%3Duy%3F%26cc
pwd=?ke&w--編碼後: pwd%3D%3Fke%26w
初始的 url=http://www.baidu.com?search="中文字元"&name=uy?&cc&pwd=?ke&w
通過URLDeCoder轉碼 encodeUrl=http://www.baidu.com?search%3D%22%E4%B8%AD%E6%96%87%E5%AD%97%E7%AC%A6%22&name%3Duy%3F%26cc&pwd%3D%3Fke%26w
通過URLDeCoder解碼 decodeUrl=http://www.baidu.com?search="中文字元"&name=uy?&cc&pwd=?ke&w

可以看出ASCII碼集內的字元字元並沒有編碼 而 中文字元進行了編碼

追及

下面附上一張ASCII字元碼錶

附上一張ASCII字元碼錶