URL 编码 / 解码
实时进行文本的 URL 编码/解码。适用于检查查询参数和处理非 ASCII URL。
完全免费
无需注册
浏览器内完成
5 种语言
深色模式
如有问题或显示异常,请通过以下方式联系我们: 联系表单 — 我们利用反馈改进。
📖 常见的坑
实时对文本进行 URL 编码与解码,遵循 encodeURIComponent,全部在浏览器内完成。所谓「URL 编码」并不是单一的一种处理——需要转义哪些字符,取决于这个值放在 URL 的什么位置。路径片段、查询值、表单提交,各自规则不同,而混淆它们正是此类问题的主要来源。
| 情形 | 会发生什么 | 怎么处理 |
|---|---|---|
| 把 encodeURI 和 encodeURIComponent 搞混 | encodeURI 是为「编码整个 URL」而存在的函数,因此它刻意保留分隔符不动:/、?、&、=、#、:。把它用在「作为查询值传递的 URL」上,该值内部的 & 与 = 就会被当作分隔符,参数随之被拆开——?redirect=https://a.com/?x=1&y=2 到达时会被读成 redirect 与 y 两个参数。症状是「值在中途被截断」,用短值测试永远发现不了。 |
URL 的「零件」请一律使用 encodeURIComponent——查询值、单个路径片段、片段的内容,都属于零件。encodeURI 只在把已经拼装完成的 URL 整体过一次时才合适,实务中几乎用不上。更可靠的做法是根本不做字符串拼接,改用 URLSearchParams 或 new URL()——写成 const u = new URL(base); u.searchParams.set("redirect", target);,关于转义的判断就彻底消失了。请把「用字符串拼接组装 URL」的每一处,都视为等待被发现的缺陷。 |
| 加号变成了空格 | 表示空格有两种方式。URI 的百分号编码用 %20,而 HTML 表单编码 application/x-www-form-urlencoded 用 +。encodeURIComponent 遵循前者,把空格编成 %20;但若接收方按表单数据解析,值里原本真实的 + 就会被转换成空格。危害最大的是邮箱别名:把 user+tag@example.com 通过查询串传递,会变成 user tag@example.com,邮件再也送不达。Base64 的标准字母表中同样含有 +,所以把令牌放进 URL 也会遇到相同问题。 |
构建查询串请使用 URLSearchParams。它会把值内部的 + 正确转义为 %2B,并把空格写成 +,因此即便接收方按表单数据解析,结果依然一致。若必须手工拼装,凡是值可能含 + 的地方,请显式替换为 %2B。要把 Base64 放进 URL,请从一开始就使用 URL-safe 字母表(- 与 _)——这比把标准字母表再做百分号编码更可靠。由于该问题只在值恰好含 + 时才暴露,请务必让测试数据里包含一个 +。 |
| 二次编码后到处都是 %25 | 把已经编码过的字符串再编码一次,% 本身就会变成 %25——%20 变 %2520,中日文的 %E3%81%82 变 %25E3%2581%2582。只解码一次的接收方就会留下这多余的一层,屏幕上直接显示出 %20 这串字面文本。根源是「由哪一层负责编码」从未被明确,典型组合是框架已自动编码,应用层又手工编码了一遍。去掉其中任何一处都能修好,但该去掉哪一处,不追代码就定不了。 |
把「在哪里编码」定在唯一一处,并写进文档——写明「本函数接收已编码的值」「只有这一层负责编码」,二次编码在结构上就不可能发生。而解码务必只做一次:「还有 % 残留,那就再解一次」这样的循环是严重的安全漏洞。攻击者发来 %252e%252e%252f,第一次解码得到 %2e%2e%2f,第二次得到 ../,于是绕过了你的路径穿越检查——因为检查是针对第一次解码结果做的。请连「保险起见再解一次」这个念头本身都避免。 |
域名使用的是 Punycode,而不是 URL 编码。国际化域名会先被转换成 xn--r8jz45g.xn--zckzah 这样的形式,再送往 DNS——浏览器在地址栏里用原文字显示,但那只是显示层面的照顾,真正被查询的是 xn-- 那串字符。另外,由于存在使用形近字符的钓鱼手法(同形异义攻击),浏览器在特定条件下会直接显示 Punycode 形式——「本该熟悉的域名突然显示成 xn-- 就该起疑」是个有用的习惯。还有一点:URL 的片段(# 之后)永远不会发送到服务器——它既不进访问日志也不进 Referer,因此比查询串更安全。但它仍会留在浏览器历史中,所以「不要把机密放进 URL」这条原则并未改变。
📖 使用方法
-
1
输入要编码的文本在上方粘贴文本,将以 encodeURIComponent 格式实时转换。
-
2
输入已编码文字进行解码在下方粘贴 URL 编码字符串,实时解码。
-
3
复制结果使用点击复制按钮将结果复制到剪贴板。
❓ 常见问题
encodeURIComponent 和 encodeURI 的区别?
encodeURIComponent 会编码 URL 结构字符;encodeURI 不会。
URL 中的日文字符会如何处理?
日文转为 UTF-8 字节序列,每字节编码为 %XX。
+ 号代表空格吗?
form-urlencoded 中 + 表示空格;encodeURIComponent 中 + 编码为 %2B。
🐛 此工具出现问题了吗?
免费、无需注册。仅提供复现步骤也有帮助。报告将直接发送给运营者并用于改进。
✅
感谢您的反馈!
已送达运营者,将用于改进工具。