URL 百分号编码详解:%20、+ 与 %2F 到底是什么意思
百分号编码会把 URL 无法安全承载的字符,写成一个百分号加上其字节值(十六进制)的形式。空格变成 %20,和号变成 %26,斜杠变成 %2F。这种编码能保护链接的结构,因为 & 和 = 等字符负责分隔查询字符串的各个部分。
哪些字符可以保持原样
URL 所基于的 URI 标准(RFC 3986)规定,有些字符无需处理:字母 A 到 Z 与 a 到 z、数字,以及四个符号 - _ . ~。这些字符永远不需要编码。其他字符在 URL 中承担着一定作用:冒号分隔协议与其余部分,斜杠分隔路径各段,问号标示查询的开始,井号标示片段的开始,& 和 = 则把查询划分为名称和值。承担结构作用的字符,如果要把它当作数据使用,就必须编码。
这就是为什么同一个字符在某处需要编码,在另一处却不需要。在查询值中,和号必须写成 %26,否则链接会在错误的位置被切断。而在链接的路径中,它只是一个普通字符。
非英文字母
基础英文字母之外的字母,会按 UTF-8 字节编码,每个字节写成一个百分号编码。café 中的 é 对应两个字节 C3 和 A9,因此写成 %C3%A9,整个词就是 caf%C3%A9。
一个简单的例子能让规则更具体。文本 a b&c=d/é 作为组件编码后,变为 a%20b%26c%3Dd%2F%C3%A9。凡不是安全字母、数字或符号的字符都会被编码:空格、和号、等号、斜杠以及带重音的字母。
组件编码还是整个 URL
两种编码各有用途。组件编码会把所有保留字符都视为数据,适用于单个值,例如搜索词或链接中的文件名。把“rock & roll”作为搜索词编码后得到 rock%20%26%20roll,因此和号保留在值之内。
整个 URL 编码会保留结构。对 https://example.com/a b 编码后得到 https://example.com/a%20b,斜杠和冒号保持不变。它适用于需要修正为有效地址的完整网址,而不适用于放在链接内部的值。
正因如此,URL 编码与解码工具 提供了 Component 和 Full URL 两种设置。整个 URL 的解码同样会保留已转义的结构字符,如 %26 和 %3D,因此解码后链接依然有效。
加号与表单数据
网页表单使用另一种约定。当表单以表单数据提交时,空格会写成 + 而不是 %20,而字面上的加号则写成 %2B。因此短语 C++ tips 在表单数据中变为 C%2B%2B+tips,在普通的组件编码中则为 C%2B%2B%20tips。
解码也存在同样的区别。在查询字符串中,+ 通常表示空格;在链接的路径中,+ 就是加号。只有勾选 Use + for spaces (form data) 时,工具才会把 + 读作空格,因此路径以及加号确有意义的值,应保持该选项关闭。
读懂很长的查询字符串
链接常在问号之后携带设置。看这个例子:
https://shop.example/search?q=red%20shirt&size=M&tag=summer%2Bsale
解码后,它表示搜索的是 red shirt,尺码是 M,标签是 summer+sale。%2B 仍是加号,因为它原本就是编码过的。把链接粘贴到 URL 编码与解码工具 中,工具会在解码后列出每个名称和值,长链接因此更容易读懂。如果你只想要去掉跟踪设置后的较短地址,请先 清理链接。
重复编码
最常见的错误是对同一个值编码两次。对文本 %20 再次编码会得到 %2520,因为百分号本身被编码成了 %25。页面随后会在值中查找字面的 %20,搜索或页面便无法匹配。请只解码一次并检查结果,只在确实需要时才编码。
损坏的转义
百分号之后必须紧跟两个十六进制数字,带重音字母的字节还必须构成有效的 UTF-8。如果链接被截断,或文本中误输入了多余的百分号,就可能出现类似 %E0%A4%A 的损坏转义。工具会解码能够解码的部分,原样保留损坏的字节,并报告有多少无法解码。它不会在遇到第一个错误时就停止。
特殊情况
- 手动输入的链接中有空格。 浏览器地址栏会自动为空格编码,但从文档中复制的链接仍可能含有原始空格。转发链接之前,请先对其编码。
- 非英文域名。 这类域名使用另一套系统,即 punycode。对路径或查询进行编码并不会改变主机名。
- 半个表情符号。 复制不完整时可能只留下一个代理项的一半,它无法被编码。工具会将其替换为替换符号,并告知你已进行替换。
- 链接中的 Base64。 链接中的 Base64 值遵循其自身规则,用 - 和 _ 代替 + 和 /。参见 Base64 详解。
如何在 fixmint 上操作
- 把文本或链接粘贴到 Text or URL 中。
- 选择 Encode 或 Decode,再选择 Component(单个值)或 Full URL(整个地址)。
- 对于从网页表单复制的链接,勾选 Use + for spaces (form data)。
- 对于链接,查看 Query parameters, decoded,以看到每个名称和值。
- 复制结果。
快速解答
%20 是什么意思?
空格。它的字节值在十六进制中是 20。
为什么我的链接里是 + 而不是 %20?
这个链接可能来自表单,其中 + 代表空格。选择 “Use + for spaces (form data)” 选项即可正确解码。
为什么我的链接里有 %2520?
这个值被编码了两次。%20 的百分号又被编码成了 %25。解码一次可以还原为 %20,再解码一次即可得到空格。
由 AI 辅助翻译自英文原文。
评论
还没有评论。快来抢沙发。


