zoukankan      html  css  js  c++  java
  • 你真的了解URLEncode吗?

    使用浏览器进行Http网络请求时,若请求query中包含中文,中文会被编码为 %+16进制+16进制形式,但你真的深入了解过,为什么要进行这种转义编码吗?编码的原理又是什么?

    例如,浏览器中进行百度搜索“你好”时,链接地址会被自动编码:
    (编码前)https://www.baidu.com/s?wd=你好
    (编码后)https://www.baidu.com/s?wd=%E4%BD%A0%E5%A5%BD
    出现以上情况是网络请求前,浏览器对请求URL进行了URL编码(URL Encoding)

    URL编码(URL Encoding):也称作百分号编码(Percent Encoding), 是特定上下文的统一资源定位符 URL的编码机制。URL编码(URL Encoding)也适用于统一资源标志符(URI)的编码,同样用于 application/x-www-form-urlencoded MIME准备数据。

    一、为什么需要URL Encoding

    在URL的最初设计时,希望可以通过书面转录,比如写在餐巾纸上告诉另外一人,因此URI的构成字符必须是可写的ASCII字符。
    中文不在ASCII字符中,因此中文出现在URL地址中时,需要进行编码;同时可书写的ASCII字符中,存在一些不安全字符也需要转码,如空格(空格容易被忽略,也容易意想不到的原因引入)。

    不安全字符

    不安全字符

    二、编码原理

    编码的原理可以表述为:
    将需要转码的字符,按指定编码方式(默认使用UTF-8编码)转化为字节流,每个字节按16进制表示,并添加%组成一个percent编码。

    例如:汉字 “你好”

    • UTF-8字节流打印为:-28 -67 -96 -27 -91 -67
    • 对应的16进制表示为:E4 BD A0 E5 A5 BD
    • URLEncode编译后为:%E4%BD%A0%E5%A5%BD

    2.1、哪些字符需要转码

    上文中提到需要转码的字符,那么哪些字符是需要转码的字符?
    这里涉及到两个概念:Reserved(保留字符)Unreserved(非保留字符)

    • Reserved(保留字符)是那些具有特殊含义的字符,例如:"/"字符用于URL不同部分的分界符;
    • Unreserved(非保留字符)没有特殊含义,包含希腊字母 / 数字 / "-" / "." / "_" / "~"

    保留字符&非保留字符

    回到刚才的问题,哪些字符是需要转码的字符?

    • 1、除了Reserved(保留字符)Unreserved(非保留字符)之外的所有字符,均需要percent编码;
    • 2、某些情况下Reserved(保留字符)也需要进行percent编码:
      Reserved(保留字符)不用于URL分隔符,而是用于其他的位置,不代表某种特性的含义时,需要进行percent编码。例如:保留字符用于URL请求query后面的value中时,要对此时用到的Reserved(保留字符)做percent编码;

    2.2、注意:空格的编码有 “+”和“%20”两种

    结论:

    • 1、空格编码为+的情况:
      提交表单时请求时Content-Type:application/x-www-form-urlencoded的情况下,URL请求查询字符串中出现空格时,需替换为+
    • 2、其他情况空格编码为%20

    依据:

    按照 rfc3986 标准,空格在进行编码时,编码后对应为%20

    空格ASCII表16进制表示对应为20

    但根据W3C标准:,提交表单时请求时Content-Type:application/x-www-form-urlencoded情况下,URL请求查询字符串中出现空格时,需替换为+

    W3C中空格替换为+号依据

    三、参考

    rfc3986:
    https://tools.ietf.org/html/rfc3986

    rfc1738:
    https://www.ietf.org/rfc/rfc1738.txt

    W3C标准:
    https://www.w3.org/TR/html4/interact/forms.html#h-17.13.4.1

    维基百科:百分号编码:
    https://zh.wikipedia.org/wiki/%E7%99%BE%E5%88%86%E5%8F%B7%E7%BC%96%E7%A0%81

    ========== THE END ==========

    欢迎关注我的公众号

  • 相关阅读:
    构建账户系统
    我的vim配置
    document.readyState和xmlhttp.onreadystatechange
    RSA非对称算法实现HTTP密码加密传输
    css3动画学习资料整理
    H5缓存机制学习记录
    [leetcode]3Sum Closest
    [leetcode]Word Ladder II
    [leetcode]Two Sum
    [leetcode]Regular Expression Matching
  • 原文地址:https://www.cnblogs.com/xiaxveliang/p/14438336.html
Copyright © 2011-2022 走看看