工具快速入口:
URL 编解码工具
json.itzhai.com
纯前端,本地处理
要点速览
- 结论 1: 整条 URL 用
encodeURI
,单个参数值用encodeURIComponent
。 - 结论 2: 表单的
application/x-www-form-urlencoded
把空格编码成+
,不是%20
。 - 结论 3: 只做 一次 编码/解码;避免双重编码(出现
%2520
等)。 - 结论 4: 统一使用 UTF-8;中文等非 ASCII 先转字节,再逐字节
%HH
。
为什么需要对 URL 进行编码?
为了在只允许 ASCII 与部分“安全字符”的 URL 中,安全携带中文、空格与特殊符号,避免结构被误解与传输损坏。
编码的本质是把字节转换为形如 %E4%B8%AD
的 percent-encoding。
URL 与 URI 有什么区别?哪些字符必须编码?
URI 是抽象集合,URL 是最常用的一种 URI;需要编码的是“非保留/非不保留之外”的字符与特定语境下的保留字符。
- 不保留(无需编码):
A–Z a–z 0–9 - _ . ~
- 保留(语义相关):
:/?#[]@!$&'()*+,;=
(在路径/查询等语境有特殊含义) - 其他字符(空格、中文、控制符等):必须编码为
%HH
(UTF-8 每个字节单独编码)。
该用 encodeURI
还是 encodeURIComponent
?
整条 URL 用 encodeURI
;查询参数“值”用 encodeURIComponent
。
场景 | 推荐 | 说明 |
---|---|---|
安全化一整条 URL | encodeURI(url) |
保留 :/?&#=… 等结构字符 |
设置/拼接查询参数 值 | encodeURIComponent(value) |
会把 & = / 等全部编码 |
解码 | decodeURIComponent (参数值)/ decodeURI (整条 URL) |
视内容而定 |
示例
1 | // ❌ 错:参数值用 encodeURI,& 会漏掉 |
表单编码(application/x-www-form-urlencoded
)是什么?为什么空格会变成 +
?
表单序列化使用的传统编码规则把空格写作 +
,其余仍按 %HH
。
因此解析表单时应先做 + → 空格
,再 decodeURIComponent
。
JS 安全解码(表单风格)
1 | function formDecode(s) { |
不同场景应该选择哪种编码方式?
优先用“带语义的 API”,避免手工拼接。
任务 | 推荐做法 |
---|---|
构造完整 URL(含查询) | URL 与 URLSearchParams (JS/Node)或各语言等价库 |
设置查询参数值 | encodeURIComponent 或 URLSearchParams.set/append |
编码路径段(如 /users/{id} 的 id ) |
encodeURIComponent (JS)、PathEscape (Go) |
解析表单/传统查询串 | + → 空格 后再 decodeURIComponent (或用语言自带表单解析) |
URL 编解码最常见的 5 个错误是什么?如何排查?
- 双重编码:出现
%2520
、%253F
。→ 只编码一次;区分“原始文本” vs “已编码文本”。 - 把
encodeURI
用在参数值:&
、=
漏掉。→ 参数值一律encodeURIComponent
。 - 忘记处理表单的
+
:空格仍是+
。→s.replace(/\+/g, ' ')
。 - 字符集不一致:中文乱码。→ 前后端统一 UTF-8。
- 不完整转义导致异常:
%
残缺。→try/catch
,必要时先做合法性检查或使用“安全解码”。
1 | function safeDecode(s) { |
如何构造与解析查询串(前端实战)?
结论:使用原生 URL
/ URLSearchParams
最稳。
1 | // 构造 |
%20
和 +
有什么区别?为什么有时 /
要编码?
%20
与 +
都可表示空格,但 +
仅在表单编码中使用;路径段中的 /
是结构字符,作为内容时必须编码 %2F
。
在查询参数值中,/
也应编码,避免被解释为路径分隔。
各语言如何做 URL 编解码(速览)?
JavaScript
1 | const u = new URL('https://ex.com/search'); |
Python
1 | from urllib.parse import urlencode, urlparse, parse_qs, quote, unquote, quote_plus, unquote_plus |
Go
1 | import "net/url" |
Java
1 | import java.net.URLEncoder; |
我只需要记住哪些?
- 整条 URL →
encodeURI
;参数值 →encodeURIComponent
。 - 表单编码空格是
+
,解析时先+→空格
再解码。 - 只做一次 编码/解码,统一 UTF-8。
需要一个现成工具吗?
URL 编解码工具(在线)
json.itzhai.com
支持 UTF-8、表单 +
处理、一键复制、深色模式。