添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
+关注继续查看

使用浏览器进行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 =

文章首发于公众号”CODING技术小馆“,如果文章对您有帮助,可关注我的公众号。
文章首发于公众号”CODING技术小馆“,如果文章对您有帮助,可关注我的公众号。
文章首发于公众号”CODING技术小馆“,如果文章对您有帮助,可关注我的公众号。

[SIGMOD 21 学习] 《JSON Tiles》解读: 半结构化 JSON 存算优化
本文是对 SIGMOD 2021 上《JSON Tiles: Fast Analytics on Semi-Structured Data》的学习总结,有错误之处欢迎交流。
【数据模拟】还在愁没有后端接口测试?快来使用json-server零编码实现强大的后端接口
【数据模拟】还在愁没有后端接口测试?快来使用json-server零编码实现强大的后端接口
FastAPI(28)- JSON Compatible Encoder 利器之 jsonable_encoder
FastAPI(28)- JSON Compatible Encoder 利器之 jsonable_encoder
Java常用的几个Json库,性能强势对比!
本篇通过JMH来测试一下Java中几种常见的JSON解析库的性能。每次都在网上看到别人说什么某某库性能是如何如何的好,碾压其他的库。但是百闻不如一见,只有自己亲手测试过的才是最值得相信的。 JSON不管是在Web开发还是服务器开发中是相当常见的数据传输格式,一般情况我们对于JSON解析构造的性能并不需要过于关心,除非是在性能要求比较高的系统。 目前对于Java开源的JSON类库有很多种,下面我们取4个常用的JSON库进行性能测试对比, 同时根据测试结果分析如果根据实际应用场景选择最合适的JSON库。