URL 编解码
编码对 URL 组件或完整 URL 进行百分号编码(RFC 3986)。
本页内容
什么是 URL 编码?#
URL 里只允许出现一小批”免转义”字符——ASCII 字母、数字,以及 -、_、.、~ 这几个符号。除此之外的一切(一个空格、一个 &、一个汉字、一个 emoji,甚至一个本意是数据而非路径分隔符的 /),都必须写成百分号转义:% 后面跟两位十六进制,比如空格是 %20,中 的 UTF-8 字节是 %E4%B8%AD。URL 编码就是这层让任意文本能安全穿过 URL 的机械翻译。
有两件经常被混为一谈的事,本工具用 Options(选项)选择器把它们分开提供:
- Component(组件)模式,对应 JavaScript 的
encodeURIComponent:除了字母、数字和- _ . ! ~ * ' (之外,全部转义。当你手里是一小块数据、马上要塞进某个查询参数、路径段或锚点时用它——目的是把/ ? & = #这些有结构含义的字符降级成纯文本,让它们失去特殊身份。 - Full(完整)模式,对应
encodeURI:转义同样的不安全字节,但故意保留 URL 自己的结构字符(: / ? # [ ] @ ! $ & ' ( ) * + , ; =)。当你手里已经是一个结构完整的 URL,只想清理其中字面字符时用它。
解码就是任一形式的逆操作。当输入里出现非法转义(比如 %GG 不是合法十六进制、或者一个孤零零的 %)时,工具会报错并指出问题位置,而不是瞎猜。
怎么使用#
- 用左上角的 编码 / 解码(Encode / Decode)开关选方向。
- 在 Options 里选 Component(处理单个要放进 URL 的值)或 Full(处理一整个要保留结构的 URL)。
- 在左侧 输入 框粘贴内容。
- 从右侧 输出 框读结果,点 复制(Copy)取走。
- 示例(Sample)载入演示串,清空(Clear)重置两边。
主要特性#
- 两种真实作用域,不是一种。 Component 对 Full,精确对应
encodeURIComponent与encodeURI的区别,不必为”转一个值”还是”整理整条 URL”切换工具。 - 默认 UTF-8。 非 ASCII 字符按 UTF-8 字节序列编码(自 RFC 3986 起的标准),所以
中文是%E4%B8%AD%E6%96%87,而不是单字节 Latin-1 那种老式写法。 - 报错带位置。 解码撞上非法
%转义时,状态栏会指出它在哪里,而不是把整段输入丢掉。 - 本地运行。 全程在浏览器里完成,你粘贴的内容不会被上传。
实例演示#
把 a/b?c=d & e 用 Component 模式编码,得到:
a%2Fb%3Fc%3Dd%20%26%20e
注意 / 变成了 %2F、? 是 %3F、= 是 %3D、空格是 %20、& 是 %26——凡是可能被当作 URL 结构的字符,全都被缴了械。这就是把一整串塞进一个查询值时的正确形态。
换成 Full 模式,编码一条完整的 URL:
https://example.com/path?q=hello world&lang=zh CN
结果保留协议、斜杠、?、& 不动,只转义了字面上的空格:
https://example.com/path?q=hello%20world&lang=zh%20CN
两种模式的差别一眼就看出来了:Component 把一切压成数据,Full 保留 URL 的骨架、只清洗需要清洗的字节。
常见问题#
Component 还是 Full,怎么定?#
如果你在拼查询串,其中某个值来自用户输入,那就用 Component 编码那个值。如果你已经有一条成型的 URL,只是里面夹了几个不该有的字符(空格、带音标的字母),整条过一遍 Full 就行。一个判别办法:输出里的 ?、&、/ 还需要作为链接的结构起作用吗?需要——用 Full。这些字符其实是数据本身?——用 Component。
解码时遇到 %GG 报错,为什么?#
% 后面必须紧跟两位十六进制。%GG 不是合法十六进制,解码器会拒绝它并报告位置——和在代码里一样会抛 URIError。要么改源头让它发 %25(字面 % 的编码形式),要么修正那个非法转义。
是先编码再拼查询串,还是先拼再编码?#
先把每个值编码好,再用 = 和 & 拼起来。如果你先拼成 ?q=a & b 再用 Component 编码整条,= 和 & 也会被转义,服务端就不再把它们当分隔符了。先编码碎片,再组装。
处理 Unicode 的方式和浏览器一致吗?#
一致。现代浏览器和服务端都期望百分号转义里装的是 UTF-8 字节,本工具吐出来的正是这个——中 是 %E4%B8%AD。如果你在排查一个还在用 Latin-1、GBK 之类老式单字节编码的老系统,字节会不一样,那时需要一个针对那种编码的专门工具。