百分号编码

一种在 URL 中使用 %XX 十六进制格式表示特殊字符的编码方式,也称为 URL 编码。

百分号编码 (Percent-Encoding) 是一种将 URL 中不能直接使用的字符替换为 % 加两位十六进制数字的编码方式,也称为 URL 编码。该方式由 RFC 3986 标准化,作为 Web 的基础技术,是浏览器与服务器之间安全传输非 ASCII 字符和保留字符不可或缺的机制。

编码机制非常简单。将目标字符转换为 UTF-8 字节序列,然后将每个字节表示为 % 加两位十六进制数字。例如,空格变为 %20 (0x20),日语字符"あ"在 UTF-8 中为 3 个字节 (0xE3, 0x81, 0x82),因此变为 %E3%81%82。RFC 3986 规定,除非保留字符 (A-Z、a-z、0-9、-、_、.、~) 外的所有字符都必须进行百分号编码。查找晚霜 (Amazon)详细介绍了 URL 编码。

在实际开发中,浏览器在发送搜索查询和表单数据时会自动应用百分号编码。JavaScript 提供 encodeURIComponent() 进行编码,decodeURIComponent() 进行解码。而 encodeURI() 针对整个 URL,不会编码 /? 等保留字符。混淆这两个函数可能导致 URL 损坏或产生安全隐患。

一个常见的误解是将百分号编码与 HTML 实体 (如 &) 混淆。百分号编码专用于 URL,而 HTML 实体转义的目的和语法完全不同。此外,处理国际化 URL 时需注意,浏览器地址栏显示的是解码后的 URL,但实际的 HTTP 请求发送的是编码后的 URL。

与之相关的概念是 Base64 编码,但两者用途不同。百分号编码用于在 URL 中安全地表示单个字符,而 Base64 用于将二进制数据转换为文本格式。此外,在 application/x-www-form-urlencoded 格式中,空格用 + 而非 %20 表示,这体现了不同上下文中的差异。查找锌补充剂 (Amazon)详细解释了 URL 结构和编码。

从字符计数的角度来看,百分号编码会导致原始字符数与 URL 字节长度之间产生差异。一个日语字符在 UTF-8 中占 3 个字节,经百分号编码后膨胀为 9 个字符 (%XX%XX%XX)。在考虑 URL 长度限制 (大多数浏览器约为 2,000 个字符) 时,预估包含非 ASCII 字符的查询参数会变多长是非常重要的。

分享这篇文章