URL 编码(也称为百分号编码,Percent-Encoding)是一种在 URL 中传输非 ASCII 字符和保留字符的机制,符合 RFC 3986 标准。
一、为什么需要 URL 编码?
因为 URL 只能包含以下几类字符:
字符类型 | 示例 |
---|
英文字母 | A-Z 、a-z |
数字 | 0-9 |
安全字符 | - _ . ~ |
保留字符(特殊意义) | : / ? # [ ] @ & = + $ , 等 |
其他字符(如空格、中文、特殊符号)必须编码后才能出现在 URL 中,以避免语义冲突。
二、URL 编码规则
原始字符 | 编码形式 | 说明 |
---|
空格 | %20 或 + | 在 application/x-www-form-urlencoded 中是 + |
! | %21 | |
# | %23 | 锚点标识,需编码 |
% | %25 | 百分号本身需编码 |
+ | %2B | 和空格冲突,需编码 |
/ | %2F | 路径分隔符,若用于参数需编码 |
中文、非 ASCII | UTF-8 后编码 | 如:中 → UTF-8:E4B8AD → %E4%B8%AD |
三、示例对比
原始参数 | 编码后 URL 片段 |
---|
keyword=中 文 | keyword=%E4%B8%AD%20%E6%96%87 |
a+b=c | a%2Bb=c |
a&b=c | a%26b=c |
123#456 | 123%23456 |
四、编码与解码:各语言示例
Java
String encoded = URLEncoder.encode("中 文", "UTF-8");
String decoded = URLDecoder.decode(encoded, "UTF-8");
JavaScript
encodeURIComponent("中 文");
decodeURIComponent("%E4%B8%AD%20%E6%96%87");
Python
import urllib.parse
urllib.parse.quote("中 文")
urllib.parse.unquote('%E4%B8%AD%20%E6%96%87')
五、常见编码函数差异(前端注意!)
函数 | 是否编码空格 | 是否编码 / | 用途 |
---|
encodeURI | ❌(保留空格) | ❌ | 编码整个 URL,不编码分隔符 |
encodeURIComponent | ✅ %20 | ✅ %2F | 编码 URL 的参数值部分 |
六、常见错误与陷阱
错误使用 | 正确做法 |
---|
中文直接拼到 URL 中 | 使用 UTF-8 编码后再转为 %xx |
用 + 表示加号 | + 要转义为 %2B |
忘记对查询参数做编码 | 所有参数值都要 encodeURIComponent() |
多次编码造成错误 | 避免重复 encode /decode |
七、应用场景
场景 | 是否需要 URL 编码 |
---|
GET 请求参数 | ✅ 是 |
POST 表单提交(application/x-www-form-urlencoded) | ✅ 是(空格转 + ) |
浏览器地址栏直接输入中文 | 浏览器自动编码 |
JSON 接口、application/json | ❌ 一般不编码 |
总结
- URL 编码是为了解决 URL 中无法直接使用某些字符的问题
- 对参数值使用
encodeURIComponent()
是最安全的方式 - 中文、空格、特殊符号必须编码成
%XX
格式 - 多数开发语言提供标准函数支持编码/解码