Web Development•
2026-02-12
•7 min
•alltools.one Team
urlencodingweb-developmenthttpapi
URL 编码指南:为什么以及如何编码 URL
你是否想过为什么 URL 中的空格会变成 %20,而 & 符号会变成 %26?URL 编码(也称为百分号编码)将 URL 中不安全的字符转换为 Web 服务器可以理解的格式。
为什么 URL 编码很重要
URL 只能包含有限的 ASCII 字符集。特殊字符、空格和非 ASCII 文本需要编码才能安全传输。如果不编码,URL 会以不可预测的方式中断 — 空格可能截断 URL,& 符号可能被误认为参数分隔符。
试试我们的 URL 编码器/解码器,看看任何文本在进行 URL 编码后会如何转换。
哪些字符需要编码?
安全字符(无需编码)
字母(A-Z、a-z)、数字(0-9)以及这些符号:-、_、.、~
保留字符(用作数据时需要编码)
| 字符 | 编码后 | 在 URL 中的用途 |
|---|---|---|
: | %3A | 协议分隔符 |
/ | %2F | 路径分隔符 |
? | %3F | 查询字符串起始 |
# | %23 | 片段标识符 |
& | %26 | 参数分隔符 |
= | %3D | 键值分隔符 |
+ | %2B | 通常表示空格 |
@ | %40 | 用户信息分隔符 |
% | %25 | 编码指示符 |
始终需要编码
空格(%20)、非 ASCII 字符(UTF-8 字节编码)以及安全集之外的任何字符。
URL 编码实践
查询参数
最常见的用例。构建搜索 URL 或 API 请求时:
https://api.example.com/search?q=hello%20world&lang=en
表单数据
使用 method="GET" 的 HTML 表单会自动对字段值进行 URL 编码。在表单编码中,空格变为 +(与百分号编码略有不同)。
路径段
URL 路径中的文件名和资源标识符也需要编码。名为 my report.pdf 的文件在 URL 中变为 my%20report.pdf。
不同语言中的编码
JavaScript:
encodeURIComponent('hello world & more')
// "hello%20world%20%26%20more"
decodeURIComponent('hello%20world')
// "hello world"
Python:
from urllib.parse import quote, unquote
quote('hello world & more')
# 'hello%20world%20%26%20more'
常见错误
- 双重编码 — 对已编码的 URL 进行编码会将
%20变成%2520 - 使用
encodeURI而不是encodeURIComponent—encodeURI跳过在查询值中很重要的保留字符 - 未编码
+号 — 在 URL 中,+可能表示空格。将字面量加号编码为%2B - 忘记非 ASCII 字符 — Unicode 字符需要先进行 UTF-8 编码,然后再进行百分号编码
常见问题
encodeURI 和 encodeURIComponent 有什么区别?
encodeURI 编码完整的 URL,跳过 :、/、?、# 等字符。encodeURIComponent 编码除未保留字符之外的所有内容 — 用于单个查询参数值。
为什么空格有时变成 + 有时变成 %20?
表单编码(application/x-www-form-urlencoded)使用 + 表示空格。标准百分号编码使用 %20。两者在不同上下文中都是有效的。
相关资源
- Base64 编码详解 — 另一种必备的编码方案
- JSON API 设计模式 — 构建正确处理编码的 API
- URL 编码器/解码器 — 即时编码和解码 URL
- Base64 编码器 — 以 Base64 格式编码数据