URL 编码(Percent-Encoding)是一种将特殊字符转换为 % 后跟两位十六进制数的标准机制,用于确保 URL 或表单数据在传输过程中的安全性和兼容性
以下是详细解析:
1. URL 编码的本质
目的:解决 URL 仅支持 ASCII 字符的问题,将非 ASCII 字符(如中文、空格)或特殊字符(如
&、=)转换为安全格式别名:又称 百分号编码(Percent-Encoding)
2. 编码规则
需要编码的字符
保留字符(有特殊语法意义):
!→%21、#→%23、&→%26、?→%3F等完整列表见 RFC 3986 标准45。
非 ASCII 字符(如中文):
先转为 UTF-8 字节序列,再逐字节编码(如
中→%E4%B8%AD)空格:编码为
%20或+(表单提交中常用+)
无需编码的字符
安全字符:字母(A-Za-z)、数字(0-9)、部分符号(如
-、_、.)
3. 编码转换示例
4. 常见编码场景
URL 参数:如
https://example.com?q=搜索→q=%E6%90%9C%E7%B4%A2表单提交:
application/x-www-form-urlencoded格式(默认 HTML 表单)API 请求:确保参数传递的准确性8。
5. 编程实现
Python:
from urllib.parse import quote, unquote
encoded = quote("搜索!@#") # 编码 → '%E6%90%9C%E7%B4%A2%21%40%23'
decoded = unquote("%E6%96%87%E4%BB%B6") # 解码 → '文件'JavaScript:
const encoded = encodeURIComponent("文件/name"); // → '%E6%96%87%E4%BB%B6%2Fname'
const decoded = decodeURIComponent("%21%40"); // → '!@'6. 注意事项
字符集一致性:非 ASCII 字符必须使用 UTF-8 编码(如中文需先转 UTF-8 字节)
避免多次编码:如
%2520需解码两次(%20→ 空格)