一文详解 URLEncode

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

使用浏览器进行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技术小馆“,如果文章对您有帮助,可关注我的公众号。

目录
相关文章
|
1月前
|
人工智能 自然语言处理 安全
Claude Code 全攻略:命令大全 + 实战工作流(建议收藏)
本文介绍了Claude Code终端AI助手的使用指南,主要内容包括:1)常用命令如版本查看、项目启动和更新;2)三种工作模式切换及界面说明;3)核心功能指令速查表,包含初始化、压缩对话、清除历史等操作;4)详细解析了/init、/help、/clear、/compact、/memory等关键命令的使用场景和语法。文章通过丰富的界面截图和场景示例,帮助开发者快速掌握如何通过命令行和交互界面高效使用Claude Code进行项目开发,特别强调了CLAUDE.md文件作为项目知识库的核心作用。
36413 71
Claude Code 全攻略:命令大全 + 实战工作流(建议收藏)
|
2月前
|
人工智能 Shell API
写一个你自己的Agent Skills
Agent Skills 是轻量级开放格式,通过 `SKILL.md` 定义可复用、可版本控制的AI技能模块,支持渐进式上下文加载,让智能体按需扩展能力——一次开发,多端部署,赋能个人、团队与企业高效构建专属AI工作流。(239字)
975 0
|
6月前
|
机器学习/深度学习 人工智能 前端开发
终端里的 AI 编程助手:OpenCode 使用指南
OpenCode 是开源的终端 AI 编码助手,支持 Claude、GPT-4 等模型,可在命令行完成代码编写、Bug 修复、项目重构。提供原生终端界面和上下文感知能力,适合全栈开发者和终端用户使用。
53057 11
|
11月前
|
监控 安全 应用服务中间件
网站出现“SSL handshake failed“?SSL握手失败(525)的错误修复指南
本文详细解析了Cloudflare中常见的SSL握手失败(525)错误,从问题定义到根源分析,再到具体解决方案,提供了一站式修复指南。通过检查证书域名匹配、有效性及时钟同步等问题,结合Nginx/Apache配置调整与Cloudflare设置优化,帮助用户彻底解决525错误。同时,文章还提供了预防措施,如自动续期和SSL状态监控,确保网站长期稳定运行。跟随步骤操作,可有效避免SSL相关故障,保障网站安全访问。
8464 0
网站出现“SSL handshake failed“?SSL握手失败(525)的错误修复指南
|
安全 Java 程序员
【HTTP】认识 URL 和 URL encode
【HTTP】认识 URL 和 URL encode
487 0
|
Java 测试技术 Maven
Maven打包使用多线程加速构建过程
Maven打包使用多线程加速构建过程
3289 0

热门文章

最新文章