天天看點

JAVA 解決URLEncoder加密後,%後的字母變成小寫

前言

當你搜到這篇文章,我感覺多半是因為對接了.NET的相關接口。

在C#裡面,使用HttpUtility.UrlEncode(xxx); 出來的值,% 後面的字母是小寫的;

而在java裡面,URLEncoder.encode(xxx, "utf-8"); 出來的值, % 後面的字母是大寫的;

正文

加密

将url編碼函數加密後的值,% 後面的字母轉為小寫, 使其與C# 使用HttpUtility.UrlEncode(xxx)的值一樣:

public static String getEncode(String needEncodeStr) throws UnsupportedEncodingException {

        String encodeStr = URLEncoder.encode(needEncodeStr, "utf-8");
        String[] uppercase = new String[0XFF + 1];
        String[] lowercase = new String[0XFF + 1];
        for (int i = 0; i <= 0XFF; i++) {
            uppercase[i] = "%" + String.format("%02x", i);
            lowercase[i] = uppercase[i];
            uppercase[i] = uppercase[i].toUpperCase();
        }
      return   StringUtils.replaceEach(encodeStr, uppercase, lowercase);
// StringUtils.replaceEac :org.apache.commons.lang3.StringUtils;
    }      

測試,可以看到如願,%後的大寫字母已經變成小寫,而且是針對特殊的符合轉換的那一部分:

public static void main(String[] args) throws UnsupportedEncodingException {

        String needEncodeStr="https://jcTest.com";
        String encodeStr = URLEncoder.encode(needEncodeStr, "utf-8");
        System.out.println("正常java的url編碼函數加密後:"+encodeStr);
        String encodeStrNew = getEncode(needEncodeStr);
        System.out.println("大寫字母變小寫的處理後:"+encodeStrNew);

    }      
JAVA 解決URLEncoder加密後,%後的字母變成小寫

解密

那麼如果涉及到url編碼函數解密,上面得到的小寫字母值,

用java的URLDecoder.decode(xxx,"UTF-8");

String encodeStr="https%3a%2f%2fjcTest.com";
        String decode = URLDecoder.decode(encodeStr, "UTF-8");
        System.out.println(decode);      

測試結果:

JAVA 解決URLEncoder加密後,%後的字母變成小寫

可以看到解密的時候,%後面的小寫大寫并沒有什麼影響,還是能正常解密。

但是如果你不放心,那麼可以先将%後面的小寫字母重新轉換回大寫,再進行解密,也是可以的。

String encodeStr="https%3a%2f%2fjcTest.com";
        String decode1 = getDecode(encodeStr);
        System.out.println(decode1);      
public static String getDecode(String encodeStr) throws UnsupportedEncodingException {
        String[] uppercase = new String[0XFF + 1];
        String[] lowercase = new String[0XFF + 1];
        for (int i = 0; i <= 0XFF; i++) {
            uppercase[i] = "%" + String.format("%02x", i);
            lowercase[i] = uppercase[i];
            uppercase[i] = uppercase[i].toUpperCase();
        }
        String s = StringUtils.replaceEach(encodeStr, lowercase, uppercase);
        return   URLDecoder.decode(s,"UTF-8");
    }