HTTP URL 编码
HTTP - URL 编码 (百分号编码)
Section titled “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’。
JavaScript 示例:
Section titled “JavaScript 示例:”大多数编程语言都提供了用于 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!常见编码字符:
Section titled “常见编码字符:”下表展示了一些常见字符及其百分号编码表示。请注意,表中未列出但属于“保留”或非 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 文档。