1. 程式人生 > >URL encoding科普

URL encoding科普

什麼是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的原則

  1. 誰生產Url,誰負責encode規則。原則上只encode查詢引數的value部分,查詢引數的key以及path避免特殊字元。
  2. encode僅一次,decode僅一次。
  3. 保留字元必須encode
  4. 非保留字元不能encode
  5. 其它字元強烈建議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();
}

參考連結

RFC 3986
Wikipedia Percent-encoding