快速尝试:

URL 编码与最佳实践

URL 编码 (URL Encoding),又称作 Percent Encoding,编码由 % 与两位十六进制组成,是用于 URL 中的编码机制。见百分号编码

未保留字符

以下字符为未保留字符:

'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_.~'

建议所有的 URI 必须对未保留字符不加以百分号编码,其它字符建议先转换为 UTF-8 再逐字节使用百分号编码。

编码规则

  1. 未保留字符保持不变
  2. 其他字符先转换为 UTF-8 编码
  3. 将 UTF-8 编码的每个字节转换为百分号编码

转化过程

山月

  1. Unicode To UTF-8 中,可知 山月 的 UTF-8 编码为 E5 B1 B1 E6 9C 88
  2. 对其编码后的 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('?!')

URL 编码最佳实践

  1. 始终编码用户输入:不要假设用户输入只包含安全字符。
  2. 使用正确的编码函数:不同语言的编码函数可能有细微差别,选择适合你需求的函数。比如 JavascriptencodeURIComponentencodeURI 有区别。
  3. 注意编码的范围:某些字符(如 /)在 URL 的不同部分有不同的含义,根据上下文决定是否编码。
  4. 避免重复编码:解码后再编码可能导致意外结果。
  5. 考虑国际化:确保你的应用能正确处理各种语言和字符集。
  6. 测试边界情况:测试包含各种特殊字符和非 ASCII 字符的输入。
  7. 遵循 RFC 标准:参考 RFC 3986 以了解更多细节。

结论

URL 编码是 Web 开发中不可或缺的一部分。正确理解和应用 URL 编码可以帮助你构建更健壮、更安全的应用程序。通过遵循本文提到的最佳实践,你可以避免许多与 URL 编码相关的常见问题,提高应用的可靠性和用户体验。