URL 编码特殊字符:开发者参考手册
全面介绍 URL 编码特殊字符的参考手册,涵盖空格、和号、Unicode 等内容。
URL 中的特殊字符
URL 的语法由 RFC 3986 严格定义。许多字符具有特殊含义,或者在 URL 的某些部分中不被允许出现。理解如何正确地编码这些字符,对于构建可靠的 Web 应用和 API 至关重要。
空格字符
空格是最常被编码的字符。不过,根据上下文的不同,它可以有两种编码方式:
%20—— RFC 3986 定义的百分号编码(percent-encoding),用于 URL 路径以及大多数场景+—— 用于application/x-www-form-urlencoded格式(即 HTML 表单提交)
在通过程序构建 URL 时,为了保持一致性,建议优先使用 %20。而在构造表单数据时,+ 表示法才是标准做法。
保留字符深入解析
和号(&)
和号用于分隔查询参数。当和号出现在某个参数值中时,必须将其编码为 %26,以防止它被解释为分隔符。在 HTML 环境中,它还必须以实体形式编码为 &。
问号(?)
问号用于分隔路径和查询字符串。如果问号出现在某个参数值中,必须将其编码为 %3F。请注意,encodeURI() 并不会对问号进行编码,而 encodeURIComponent() 则会。
井号(#)
井号用于标识片段标识符(fragment identifier)的起始位置。在 URL 中,查询参数值里的任何 # 都必须编码为 %23,否则浏览器会将其后的所有内容都当作片段标识符,从而不会将这部分内容发送给服务器。
正斜杠(/)
正斜杠用于分隔路径片段。当斜杠出现在某个路径片段的值中时(例如文件名本身包含斜杠),必须将其编码为 %2F。请注意,某些服务器可能会先对 %2F 进行解码,然后仍然将其视为路径分隔符。
Unicode 字符
非 ASCII 字符的编码方式是:先将其转换为对应的 UTF-8 字节序列,然后对每个字节进行百分号编码。以下是一些示例:
- 带尖音符的拉丁字母 e(e)→ UTF-8:0xC3 0xA9 →
%C3%A9 - 汉字(中)→ UTF-8:0xE4 0xB8 0xAD →
%E4%B8%AD - 表情符号(地球)→ UTF-8:0xF0 0x9F 0x8C 0x8D →
%F0%9F%8C%8D
在不同 URL 组成部分中的编码
| 组成部分 | 需要编码的字符 | 示例 |
|---|---|---|
| 路径片段 | 空格、?、# 以及非 ASCII 字符 | /path/my%20file |
| 查询键 | =、&、#、+、空格 | my%20key=value |
| 查询值 | &、#、+、空格、= | key=hello%20world |
| 片段 | 空格以及非 ASCII 字符 | #section%20one |
常见陷阱
- 忘记对查询值中的
#进行编码(URL 的剩余部分会被悄无声息地丢弃) - 对已经编码过的字符串重复编码(导致出现
%2520而不是%20) - 在编码参数值时错误地使用
encodeURI()而非encodeURIComponent() - 未对查询值中的
+进行编码(它会被解码成空格) - 想当然地认为所有服务器对路径中
%2F的处理方式都相同