参考手册10 分钟阅读

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 的处理方式都相同

相关文章

试用我们的免费工具