如何使用 URL 编码/解码工具
- 要把文本变成可以安全放进 URL 的形式,选择编码;要把百分号编码的文本还原成可读字符,选择解码。
- 在上方输入框中输入或粘贴内容。每输入一个字符结果就会更新,无需点击任何按钮。
- 编码时,如果粘贴的是完整网址而不是单个值,请勾选编码完整 URL;如果结果要放进表单形式的查询字符串,请勾选将空格编码为 +。
- 解码时,将 + 解码为空格默认开启。如果文本中的加号就是真正的“+”,请把它关闭。
- 点击复制,或点击⇅ 互换把结果移到输入框并切换模式——这样可以快速确认一个值编码后再解码能否原样还原。
只要输入的是以 http:// 或 https:// 开头的完整网址,下方就会出现URL 组成部分表格,列出协议、主机、解码后的路径、每个查询参数(各占一行)以及 # 后面的锚点。阅读冗长的跟踪链接或别人发来的 API 请求地址时,这是最快的办法。
什么是百分号编码
规定 URL 语法的标准 RFC 3986 只允许少数 ASCII 字符原样出现。字母、数字和 - . _ ~ 属于“非保留字符”,永远不需要编码。: / ? # [ ] @ ! $ & ' ( ) * + , ; = 等属于“保留字符”,它们用来分隔 URL 的各个部分,因此出现在值里面时必须编码。其余所有字符——空格、引号、带重音的字母、中日韩文字、表情符号——一律需要编码。
编码针对的是字节而不是字符。文本先被转换成 UTF-8,然后每个需要转义的字节写成 % 加两位十六进制数。所以一个字符可能变成好几个转义序列:é 占 2 个字节(%C3%A9),常用汉字大多占 3 个字节(咖 是 %E5%92%96),👍 这样的表情符号占 4 个字节(%F0%9F%91%8D)。
三个选项的区别
- 默认使用 JavaScript 的
encodeURIComponent。除字母、数字和- _ . ! ~ * ' ( )外,其他字符全部转义,因此&、=、/、?、+都会被编码。适用于 URL 中的某一个片段:搜索词、参数值、路径中的文件名。 - 编码完整 URL改用
encodeURI,不会改动保留字符,网址结构得以保留。适合整理含有空格或中文的链接。 - 将空格编码为 +会把所有
%20替换为+,这是 HTML 表单提交(application/x-www-form-urlencoded)的惯例。在默认模式下,文本中原有的加号会变成%2B,因此不会和空格混淆。
示例
| 输入 | 设置 | 输出 |
|---|---|---|
café & croissants | 默认 | caf%C3%A9%20%26%20croissants |
café & croissants | 空格编码为 + | caf%C3%A9+%26+croissants |
咖啡 | 默认 | %E5%92%96%E5%95%A1 |
a+b=c | 默认 | a%2Bb%3Dc |
50% off | 默认 | 50%25%20off |
https://example.com/search?q=naïve café&lang=fr | 完整 URL | https://example.com/search?q=na%C3%AFve%20caf%C3%A9&lang=fr |
“编码完整 URL”无法修复值里已经含有保留字符的网址。用这种方式编码 https://example.com/search?q=rock & roll&page=2,得到的是 q=rock%20&%20roll,服务器只会把 q 读成“rock ”。正确做法是先用默认模式单独编码这个值,得到 rock%20%26%20roll,再把它放进网址。
常见错误
- 重复编码。对已经编码过的文本再编码一次,每个
%都会变成%25,于是%20变成%2520。如果链接中出现%25后面跟着两位十六进制数,说明某处编码了两次。先解码一次再检查。 - 应当保留的加号。在查询字符串里
+通常表示空格,但在路径中或由encodeURIComponent生成的数据里,它可能是真正的加号。如果+86…这样的电话号码解码后丢了加号,请关闭加号选项。 - 旧字符编码。有些老系统编码的是 GBK、Latin-1 或 Shift_JIS 字节而不是 UTF-8,会产生
caf%E9这类结果。这些字节不是有效的 UTF-8,因此解码器会报错,而不是去猜测。 - 该用 HTML 转义时用了 URL 编码。百分号编码只保证文本在 URL 中安全,而不是在网页中。要在 HTML 中显示
<或&,请使用 HTML 实体编码。要把二进制数据放进 URL,URL 安全的 Base64 通常更合适。
常见问题
为什么解码时会出错?
输入中有一个 % 后面没有跟两位十六进制数(例如 100%),或者某个多字节字符被截断了——比如 %E2%82 要加上最后的 %AC 才是 €。请确认复制了完整的字符串。像折扣信息这样只是含有百分号的文本,本来就没有编码过,不需要解码。
空格应该写成 %20 还是 +?
在 URL 的查询部分,读取表单数据的服务器会把两者都当作空格。在路径中只有 %20 是正确的:/my+file.pdf 指的是文件名里带加号的文件。拿不准时就用 %20,所有服务器都认得。
链接里的中文需要编码吗?
浏览器地址栏会直接显示中文,但实际发送的是百分号编码后的字节。把这样的 URL 写进代码、HTTP 头、邮件模板或网站地图时,应先编码,确保所有系统读到的是同一个地址。
中文域名怎么处理?
主机名使用另一套机制 Punycode,在 DNS 中 中文.cn 会变成 xn--fiq228c.cn。百分号编码针对的是路径、查询字符串和锚点。