一文详解 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
。

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

三、参考
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 ==========

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!