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

猜你喜欢

转载自blog.csdn.net/kimylrong/article/details/53510411
URL
今日推荐