URL 编码与最佳实践
URL 编码 (URL Encoding
),又称作 Percent Encoding
,编码由 % 与两位十六进制组成,是用于 URL 中的编码机制。见百分号编码。
未保留字符
以下字符为未保留字符:
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_.~'
建议所有的 URI 必须对未保留字符不加以百分号编码,其它字符建议先转换为 UTF-8 再逐字节使用百分号编码。
编码规则
- 未保留字符保持不变
- 其他字符先转换为 UTF-8 编码
- 将 UTF-8 编码的每个字节转换为百分号编码
转化过程
如 山月
- 在 Unicode To UTF-8 中,可知
山月
的 UTF-8 编码为E5 B1 B1 E6 9C 88
- 对其编码后的 UTF-8,分别添加百分号
%E5%B1%B1%E6%9C%88
API
可注意各语言 API 对于保留字符 !
(
等的处理
Javascript
// => '%E5%B1%B1%E6%9C%88'
encodeURIComponent('山月')
// => '山月'
decodeURIComponent('%E5%B1%B1%E6%9C%88')
// => '(!'
encodeURIComponent('(!')
Python
from urllib.parse import quote, unquote
# => '%E5%B1%B1%E6%9C%88'
quote('山月')
# => '山月'
unquote('%E5%B1%B1%E6%9C%88')
# => '%3F%21'
quote('?!')
相关工具
- Unicode 转 UTF-8:了解字符在 URL 编码前如何进行 UTF-8 编码
- HTML 实体编码:Web 开发中另一种常用的编码方式
- Base64 编码:二进制数据的另一种常见编码方法
与 UTF-8 的联系
URL 编码与 UTF-8 编码密切相关。当对非 ASCII 字符进行 URL 编码时:
- 第一步:将字符转换为 UTF-8 字节序列
- 第二步:对每个 UTF-8 字节应用百分号编码
理解 UTF-8 编码有助于您更好地理解为什么 URL 编码会产生特定的结果。例如,中文字符 山
变成 %E5%B1%B1
是因为:
山
的 UTF-8 编码是字节序列E5 B1 B1
- 每个字节前加上
%
前缀:%E5%B1%B1
使用我们的 UTF-8 编码工具 查看详细的转换过程!
URL 编码最佳实践
- 始终编码用户输入:不要假设用户输入只包含安全字符。
- 使用正确的编码函数:不同语言的编码函数可能有细微差别,选择适合你需求的函数。比如
Javascript
中encodeURIComponent
与encodeURI
有区别。 - 注意编码的范围:某些字符(如
/
)在 URL 的不同部分有不同的含义,根据上下文决定是否编码。 - 避免重复编码:解码后再编码可能导致意外结果。
- 考虑国际化:确保你的应用能正确处理各种语言和字符集。
- 测试边界情况:测试包含各种特殊字符和非 ASCII 字符的输入。
- 遵循 RFC 标准:参考 RFC 3986 以了解更多细节。
结论
URL 编码是 Web 开发中不可或缺的一部分。正确理解和应用 URL 编码可以帮助你构建更健壮、更安全的应用程序。通过遵循本文提到的最佳实践,你可以避免许多与 URL 编码相关的常见问题,提高应用的可靠性和用户体验。