Skip to content

HTTP URL 编码

URL 设计用于在互联网上传输,这在历史上意味着使用 ASCII 字符集。虽然现代的国际化资源标识符 (IRIs) 支持更广泛的字符集,但将 IRI 转换为 URI 的过程通常需要对不在“保留”字符集或在 URI 中具有特殊含义的字符进行编码。这种编码过程称为百分号编码(percent-encoding)。

百分号编码确保 URL 在不同系统之间得到统一解析。不安全或特殊字符会被替换为一个 ’%’ 符号,后跟两个十六进制数字,代表该字符的字节值。对于 US-ASCII 范围之外的字符(例如,带重音的字母、中文字符),它们通常首先使用 UTF-8 编码成字节序列,然后对每个字节进行百分号编码。

  • 保留字符 (Reserved Characters): ’:’、’/’、’?’、’#’、’[’、’]’、’@’、’!’、’$’、’&’、'''、’(’、’)’、’*’、’+’、’,’、’;’、’=’ 等字符在 URI 中具有特殊含义。如果这些字符是数据的一部分(例如,查询参数值),且并非用于其特殊用途,则必须进行百分号编码。
  • 非保留字符 (Unreserved Characters): A-Z、a-z、0-9、’-’、’_’、’.’、’~’ 等字符无需编码。
  • 空格字符 (Space Character): 空格通常被编码为 ‘%20’。在 URL 的查询字符串部分,它也可以编码为 ’+’ (加号),但 ‘%20’ 在 URI 的所有部分都普遍接受。
  • 非 ASCII 字符 (Non-ASCII Characters): 转换为 UTF-8 字节,然后对每个字节进行百分号编码。例如,‘é’ (UTF-8: 0xC3 0xA9) 变成 ‘%C3%A9’。

大多数编程语言都提供了用于 URL 编码的内置函数。在 JavaScript 中,encodeURIComponent() 通常用于编码查询参数值:

let paramValue = "search query with spaces & symbols!";
let encodedValue = encodeURIComponent(paramValue);
console.log(encodedValue);
// Output: search%20query%20with%20spaces%20%26%20symbols!

下表展示了一些常见字符及其百分号编码表示。请注意,表中未列出但属于“保留”或非 ASCII 类别的字符遵循相同的编码规则。

字符名称符号百分号编码
控制字符 (ASCII < 32)varies (例如, 换行符)编码为 %xx (例如, 换行符为 %0A)
空格’ ‘%20 (或在查询字符串中为 +)
百分号’%‘%25
与号 (Ampersand)’&‘%26 (特别是在查询参数中)
加号 (Plus)’+‘%2B (如果 ’+’ 本身是数据)
斜杠 (Forward Slash)’/‘%2F (如果作为路径段的一部分,而非分隔符)
问号 (Question Mark)’?’%3F (如果作为数据的一部分,而非查询分隔符)
井号 / 磅号 (Hash / Pound)’#‘%23 (如果作为数据的一部分,而非片段分隔符)
等号 (Equals)’=‘%3D (特别是在查询参数中)
非 ASCII (例如, ’€‘)欧元符号 (Euro sign)%E2%82%AC (UTF-8 字节 C2 82 AC,然后进行百分号编码)

为了更全面地理解,请参考定义 URI 的 RFC 3986 文档。