Menu

URL 编码/解码

安全地编码和解码 URL 组件。

作者 Nethanel Bar, Co-founder & CEO

最后更新

准备好真正学会编程了吗?

Coddy 让你在浏览器里编写真实代码来学习:互动课程、即时反馈,卡住时还有 AI 帮忙。

URL 编码器是什么?

URL 编码器(也叫百分号编码器或 URI 编码器)会把 URL 中保留的或不安全的字符,替换成 % 加两位十六进制数字。开发者在拼接查询字符串、转义路径片段、分享包含空格或非 ASCII 字符的网址,以及调试重定向时都会用到它。

URL 只允许使用一小部分 ASCII 字符。这个范围之外的任何字符,比如空格、带重音的字母、emoji,或者作为数据使用的 ?、#、&、= 等保留符号,都必须经过百分号编码,才能从浏览器完整地传到服务器。

JavaScript 提供了两个编码函数:encodeURI(保留 URL 结构:/、?、#、&)和 encodeURIComponent(编码所有保留字符)。对要塞进查询字符串的值使用 encodeURIComponent,对需要保持可用的完整 URL 使用 encodeURI。

编码 URL 时你会学到

  • 百分号编码把一个字节替换成 % 加两位十六进制数字,例如空格会变成 %20。
  • 保留字符(: / ? # & = +)在 URL 结构中有特定含义。当它们作为数据而不是分隔符使用时,必须进行编码。
  • 非 ASCII 文本(带重音的字母、emoji、西里尔字母、中日韩文字)会先转换成 UTF-8 字节,再对每个字节进行百分号编码。
  • encodeURI 会保持 URL 结构不变;encodeURIComponent 会编码所有保留字符。在正确的位置用正确的函数。

URL 编码和解码步骤

  1. 选择方向

    如果你有原始文本,想让它可以安全地放进 URL,就选“编码”。如果你有一个 % 编码的字符串,想还原出原文,就选“解码”。

  2. 选择编码模式

    查询字符串的值选 encodeURIComponent(编码所有保留字符);完整 URL 选 encodeURI(保留结构)。

  3. 粘贴输入

    粘贴原始文本或编码后的 URL。支持多行输入,可以批量解码。

  4. 复制结果

    复制编码或解码后的值。转换在你的浏览器本地完成,所以 URL 中的敏感信息不会离开你的设备。

常见 URL 编码速查

最常被编码的字符及其百分号编码形式。保留字符的语义来自 RFC 3986。

字符编码后原因
空格%20URL 中不允许出现空格
!%21部分服务器将其保留
#%23标记片段的开始
$%24保留字符
&%26分隔查询参数
+%2B在表单编码的请求体中表示空格
/%2F路径分隔符
:%3A分隔协议和主机
=%3D在查询字符串中分隔键和值
?%3F标记查询字符串的开始
@%40分隔用户信息和主机
UTF-8 字节%C3%A9每个非 ASCII 字节都会被编码

可以试试的 URL 编码示例

编码一个搜索词

原文

hello world & more

编码后

hello%20world%20%26%20more

空格变成 %20,& 变成 %26,这样它就不会被误认为是查询参数的分隔符。

编码非 ASCII 字符

原文

café

编码后

caf%C3%A9

é 的 UTF-8 字节序列是 0xC3 0xA9,所以这一个字符编码后会有两组 %XX。

encodeURI 与 encodeURIComponent 的区别

原文

https://example.com/path?q=hello world

encodeURI

https://example.com/path?q=hello%20world

encodeURIComponent

https%3A%2F%2Fexample.com%2Fpath%3Fq%3Dhello%20world

encodeURI 保持 URL 结构不变(斜杠、?、=)。encodeURIComponent 会编码所有保留字符,应该用在放进查询字符串的值上,永远不要用在整个 URL 上。

URL 编码的常见错误

  • 对查询字符串的值使用 encodeURI:& 和 = 不会被编码,从而破坏参数解析。
  • 对 URL 编码了两次。出现 %2520 而不是 %20,就是重复编码 bug 的典型标志。
  • 忘了 + 在 application/x-www-form-urlencoded 请求体中表示空格,但在 URL 路径或查询中就是字面的 +。
  • 用字符串插值把用户的原始输入直接拼进 URL。一定要先对值进行编码。
  • 以为 decodeURIComponent 能接受任何字符串。遇到后面没有跟两位十六进制数字的单独 % 时,它会抛出异常。

URL 编码常见问题

URL 编码是什么?
URL 编码(也叫百分号编码)是一种表示字符的方法:把在 URL 中有特殊含义或者不适合直接传输的字符,替换成 % 加两位十六进制数字。
encodeURI 和 encodeURIComponent 有什么区别?
encodeURI 会保留 URL 的结构字符(/、?、#、&、=、+)。encodeURIComponent 会把它们全部编码,这正是放进 URL 中的单个值所需要的,比如查询参数值、路径片段、片段标识。参见 MDN 中 encodeURI 和 encodeURIComponent 的参考文档。
为什么空格会变成 %20?
URL 中不允许出现空格,所以要替换成 %20,也就是 ASCII 空格字符(十六进制 0x20)的百分号编码。
什么时候需要进行 URL 编码?

任何用户提供的或动态生成的值,在放进 URL 之前都要编码,比如查询字符串的值、路径片段、重定向目标、OAuth 参数。永远不要假定原始输入是 URL 安全的。

URL 编码可以还原吗?
可以,这就是 URL 解码。decodeURI、decodeURIComponent 或任何 URL 解码器,都能把百分号编码还原成原来的字符。

了解更多

其他开发者工具

Coddy 编程语言插图

和 Coddy 一起学编程

开始