如何编码和解码 URL

· 7 分钟阅读

如果您曾经在URL中看到%20而应该是空格,或者%C3%A9而应该是带重音的字符,那么您遇到了URL编码。这是网络工作方式的基本部分,理解它有助于您调试损坏的链接、API问题和表单提交。基于浏览器的编码器在本地处理整个工作,而无需将您的数据上传到服务器。

URL编码的作用

URL只能安全地包含一组有限的字符:字母(A-Z, a-z)、数字(0-9)和一些特殊字符(-, _, ., ~)。其他所有内容(空格、带重音的字符、表情符号和如&、=、#、?等符号)都必须转换为安全格式。

URL编码(也称为百分号编码)将不安全的字符替换为%后跟其十六进制字节值:

字符编码
空格%20
&%26
=%3D
#%23
?%3F
/%2F
@%40
:%3A
+%2B
,%2C
;%3B
(换行)%0A
(制表符)%09

何时需要URL编码

如何编码和解码

  1. 选择编码或解码:选择方向。对查询参数选择encodeURIComponent,对完整URL选择encodeURI。
  2. 粘贴您的输入:输入文本或URL。结果会立即更新。
  3. 复制输出:在您的代码、API请求或浏览器中使用结果。

URL编码的简史

URL编码由1994年12月的RFC 1738与原始URL规范一起定义。该RFC由蒂姆·伯纳斯-李(网络发明者)在IETF URI工作组的输入下编写。原始编码方案使用ASCII字节值:每个保留或不安全的字符被编码为%后跟两个十六进制数字。

编码经过多次更新:

最大的变化是RFC 3986中转向UTF-8。在那之前,编码的URL仅为ASCII,非拉丁字符需要变通方法(域名的Punycode、国际地址的IDN)。今天,URL中带重音的「é」编码为%C3%A9(其两个UTF-8字节),而不是旧系统会生成的Latin-1字节%E9

encodeURI vs encodeURIComponent vs encodeURIFull

JavaScript有三种编码函数,行为略有不同:

函数编码内容保留内容用于
encodeURI()所有不安全字符URL语法::/ ? & = #编码整个URL
encodeURIComponent()所有不安全字符,包括URL语法仅A-Z a-z 0-9 - _ . ~ ! * ' ( )查询参数值
escape()(已弃用)大多数不安全字符仅Latin-1请勿使用

在Python中:

在其他语言中:

语言组件编码完整URI编码
JavaURLEncoder.encode()(对+有注意事项)URI.toASCIIString()
C#Uri.EscapeDataStringUri.EscapeUriString
RubyCGI.escape()URI.encode_www_form_component
PHPrawurlencode()urlencode()(注意:%2B vs +)
Gourl.QueryEscape()url.PathEscape()
Rustpercent_encoding cratepercent_encoding crate

常见陷阱

工作示例

输入encodeURIencodeURIComponent
hello worldhello%20worldhello%20world
q=test&page=1q=test&page=1q%3Dtest%26page%3D1
https://x.com/pathhttps://x.com/pathhttps%3A%2F%2Fx.com%2Fpath
caf écaf%20%C3%A9caf%20%C3%A9
中文%E4%B8%AD%E6%96%87%E4%B8%AD%E6%96%87
100%100%25100%25
email@test.comemail@test.comemail%40test.com

提示

隐私和机密URL

URL编码器和解码器完全在您的浏览器中运行。您粘贴的URL、中间处理和编码/解码的输出都保留在您的设备上。没有任何内容上传到服务器、记录或与任何人共享。

这很重要,因为URL经常包含极其敏感的数据:查询参数中的API密钥和令牌、授予帐户访问权限的OAuth授权代码、会话ID、带嵌入凭据的私有S3桶的签名URL、魔法链接登录令牌、密码重置URL、揭示产品结构的内部管理URL、取消订阅链接中的客户电子邮件地址、表单提交中的个人数据。云URL编码器记录每次粘贴,有时为「服务改进」保留它们,并参与了真正的泄露,其中粘贴的身份验证令牌被监控日志的攻击者提取。基于浏览器的编码器没有任何暴露:URL永远不会离开您的机器。

基于浏览器的编码在页面加载后也可以离线工作,对于在飞机上、在没有互联网访问的安全环境中或在任何您不能或不应将带身份验证的URL粘贴到第三方服务的地方编码URL很有用。

常见问题

encodeURI 和 encodeURIComponent 有什么区别?

encodeURI 保留 URL 结构中的有效字符(斜杠、冒号、问号)。encodeURIComponent 对除字母、数字和少数安全字符外的所有内容进行编码。查询参数值使用 encodeURIComponent,完整 URL 使用 encodeURI。

为什么空格变成 %20 或 +?

在 URL 编码中,空格变为 %20。在表单数据(application/x-www-form-urlencoded)中,空格变为 +。两者在其上下文中都有效,但 %20 是 URL 的通用标准。

我需要手动编码 URL 吗?

大多数情况下,您的语言或框架会自动处理编码。手动编码在手工构建 URL、调试 API 请求或处理含特殊字符的查询字符串时很有用。

我的数据会发送到服务器吗?

不会。所有编码和解码都在您的浏览器中进行。