URL encoding科普
阿新 • • 發佈:2018-10-31
什麼是URL encoding
URL encoding是Uniform Resource Identifier(URI)規範文件中對特殊字元編碼制定的規則。本質是把一個字元轉為
%加上UTF-8編碼對應的16進位制數字。故又稱之為Percent-encoding。
RFC 3986把字元分為以下三類:
1. 18個保留字元。: / ? # [ ] @ ! $ & ' ( ) * + , ; =
2. 66個非保留字元。a-z A-Z 0-9 - _ . ~
3. 其它字元。 比如”好”等中文字元
為什麼要URL encoding
URL(本質是URI,URL是URL的一個子集)中有幾個字元有特殊意義。比如/ : ? =
如果想在URL裡面加這些特殊字元,必須要編碼一下,否則URL的真實意義與想要的效果可能會不一樣。
怎麼做URL encoding
URL encoding分為兩個步驟:
1. 獲取字元對應的16進位制數字。比如”:” UTF-8對應的10進位制是58,16進位制是3A,所以這一步”:”得到”3A”。
2. 在Step1的結果前面加”%”,這一步得到”%3A”。
URL encoding的原則
- 誰生產Url,誰負責encode規則。原則上只encode查詢引數的value部分,查詢引數的key以及path避免特殊字元。
- encode僅一次,decode僅一次。
- 保留字元必須encode
- 非保留字元不能encode
- 其它字元強烈建議encode
URL encoding例子
/** * 拼裝http查詢引數,會urlEncode。注意只encode查詢引數的value部分 */ public static String genParamsStr(Map<String, String> params) { if (params.isEmpty()) { return ""; } StringBuilder builder = new StringBuilder(); builder.append("?"); Set<String> keys = params.keySet(); Iterator<String> iterKey = keys.iterator(); String firstKey = iterKey.next(); builder.append(firstKey + "=" + params.get(firstKey)); while (iterKey.hasNext()) { String key = iterKey.next(); String value = params.get(key); String valueEncoded = ""; try{ valueEncoded = URLEncoder.encode(value, "UTF-8"); }catch(Exception e){ log.warn("error when url encode order url"); } builder.append("&" + key + "=" + valueEncoded); } return builder.toString(); }