URL 编码 (也称为百分号编码) 是将 URL 中不安全或保留的字符转换为 "%" 后跟两位十六进制数的格式的过程。例如,空格被编码为 "%20",中文字符 "你好" 被编码为 "%E4%BD%A0%E5%A5%BD"。这种编码确保 URL 在所有系统和协议中都能正确传输。
URL 编码的必要性源于 URL 规范 (RFC 3986) 对允许字符的严格限制。URL 中只能直接使用字母 (A-Z, a-z)、数字 (0-9) 和少数特殊字符 (-, _, ., ~)。其他字符,包括空格、中文、日文等非 ASCII 字符,以及 &、=、? 等保留字符,都必须经过编码才能安全地包含在 URL 中。
在 URL 缩短服务中,URL 编码是处理用户提交的长 URL 时必须正确处理的关键环节。服务需要正确解码用户输入的 URL、验证其有效性、存储原始形式、并在重定向时正确编码输出。
常见的编码问题包括双重编码 (已编码的 URL 被再次编码)、编码不一致 (部分字符编码而部分未编码)、以及不同编程语言的编码函数行为差异。
实务中特别容易出错的是加号 (+) 的处理。在 URL 的查询参数中,+ 按惯例会被解释为空格,但在路径部分 + 仍然是 + 本身。这种不一致常常成为缺陷的根源,因此想要确切地表示空格时,应当使用 %20。