前言
當你搜到這篇文章,我感覺多半是因為對接了.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);
}

解密
那麼如果涉及到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);
測試結果:
可以看到解密的時候,%後面的小寫大寫并沒有什麼影響,還是能正常解密。
但是如果你不放心,那麼可以先将%後面的小寫字母重新轉換回大寫,再進行解密,也是可以的。
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");
}