URL编码与解码
把文本转换成可以安全放进URL的形式,或把%20这类序列还原成可读字符。本工具直接调用浏览器自带的encodeURIComponent、encodeURI和decodeURIComponent,以表格列出查询参数,不向服务器发送任何数据。
0 个字符 · 0 个词 · 0 行
0 个字符 · 0 个词 · 0 行
完全在当前浏览器标签页中运行,您的文本不会被上传或保存。
各函数转义的字符
由浏览器函数本身计算得出。encodeURIComponent 不会转义字母、数字和以下符号: ! ' ( ) * - . _ ~
| 字符 | encodeURIComponent | encodeURI |
|---|---|---|
(空格) | %20 | %20 |
! | ! | ! |
" | %22 | %22 |
# | %23 | # |
$ | %24 | $ |
% | %25 | %25 |
& | %26 | & |
' | ' | ' |
( | ( | ( |
) | ) | ) |
* | * | * |
+ | %2B | + |
, | %2C | , |
/ | %2F | / |
: | %3A | : |
; | %3B | ; |
= | %3D | = |
? | %3F | ? |
@ | %40 | @ |
[ | %5B | %5B |
] | %5D | %5D |
{ | %7B | %7B |
} | %7D | %7D |
| | %7C | %7C |
\ | %5C | %5C |
^ | %5E | %5E |
` | %60 | %60 |
< | %3C | %3C |
> | %3E | %3E |
~ | ~ | ~ |
- | - | - |
_ | _ | _ |
. | . | . |
é | %C3%A9 | %C3%A9 |
€ | %E2%82%AC | %E2%82%AC |
😀 | %F0%9F%98%80 | %F0%9F%98%80 |
百分号编码与RFC 3986的保留字符
URL 只能包含有限的一组 ASCII 字符。RFC 3986 是 2005 年发布的 URI 语法规范,它把这些字符分成两类。非保留字符包括 A–Z、a–z、0–9 以及 - . _ ~ 这四个符号,永远不需要编码。保留字符各有用途:通用分隔符 : / ? # [ ] @ 用来分隔协议、主机、路径、查询和片段,子分隔符 ! $ & ' ( ) * + , ; = 用来分隔它们内部的各个部分,比如查询字符串中的 & 和 =。其余所有字符,以及被当作普通数据使用的保留字符,都必须进行百分号编码。
百分号编码把一个字节写成 % 加两位十六进制数字。文本会先转换为 UTF-8,因此空格变成 %20,é(两个字节)变成 %C3%A9,一个 emoji 则变成四组 %XX。所以搜索“café & bar”时,链接中会显示为 caf%C3%A9%20%26%20bar:其中的 & 被编码后,服务器就不会把它当作新参数的开头。
encodeURIComponent、encodeURI与解码
encodeURIComponent 适合处理单独的一段内容,例如查询参数的值、路径片段,或作为参数传递的跳转 URL。它会转义除非保留字符和 ! ' ( ) * 之外的所有字符(JavaScript 因历史原因不处理这几个字符)。encodeURI(整个 URL) 默认输入已经是完整地址,会保留保留字符不变,所以 https://example.com/a b?q=1 只有空格会被编码。对参数值使用 encodeURI 是常见的错误:值里的 & 或 # 不会被编码,会破坏整个 URL。
解码可以还原上述任一函数的结果。用 GET 提交的 HTML 表单采用较早的 application/x-www-form-urlencoded 格式,其中空格写作 + 而不是 %20;处理这类内容时请勾选将 + 视为空格,而当加号本身有意义时(如电话号码)请取消勾选。如果输入中的 % 后面不是两位十六进制数字,或字节不是有效的 UTF-8,解码会给出明确的错误提示,而不是随意猜测。当文本包含查询字符串时,其参数会解码后显示在工具下方的表格中。如果要在 URL 中传输二进制数据,通常可以改用 Base64url。
常见问题
- URL中的空格应该写成%20还是加号?
- 在路径中以及按 RFC 3986 的规定,空格是 %20。+ 只在按 HTML 表单方式编码的查询字符串中才表示空格,所以任何场合使用 %20 都是最稳妥的。
- 为什么我的URL里出现了%2520?
- 说明被编码了两次。第一次把空格变成 %20,第二次又把 % 本身编码成了 %25。解码一次即可去掉多余的一层,并且在代码中只应在一个位置对值进行编码。
- 哪些字符永远不需要百分号编码?
- 即 RFC 3986 规定的非保留字符:大小写字母 A 到 Z、数字 0 到 9,以及连字符、句点、下划线和波浪号。
- URL可以不编码直接包含中文等非英文字符吗?
- 浏览器会把它们直接显示出来,但实际传输时,路径或查询中的每个非 ASCII 字符都会以百分号编码的 UTF-8 形式发送。域名则使用另一套机制 Punycode,把它们转换成 xn-- 开头的标签。
- 为什么解码时提示序列格式错误?
- 文本中含有后面不是两位十六进制数字的 %,例如字面上的“100%”,或者这些字节解码后不是有效的 UTF-8。解码前请先把多余的 % 编码为 %25。