URL 的结构
URL 由多个部分组成,包括协议、域名、路径、查询参数和片段标识符,其中,查询参数部分就是问号后面的内容,这部分使用键值对,中间用 & 分隔。比如,http://example.com/path?key1=value1&key2=value2。
前言
根据 RFC 3986 标准,URL 中的字符分为保留字符和非保留字符。保留字符在 URL 中有特殊意义,比如: / ? # [ ] @等,这些字符如果在查询参数中出现,可能需要编码。而非保留字符包括字母、数字、- _ . ~,这些可以直接使用。
不过,查询参数的情况可能有点不同。比如,在查询参数中,有些保留字符可能被允许,但需要看具体上下文。例如,? 和 & 用于分隔参数,所以如果在参数值中包含这些字符,必须进行编码。比如,& 应该被编码为 %26,而 = 应该编码为 %3D,否则会被解析为键值对的分隔符。
还有,空格在 URL 中通常被编码为 + 或者 %20。而其他特殊字符,比如!、$、'、(、)、*、,、; 等,可能需要视情况而定。比如,+ 在查询参数中会被视为空格,所以如果有真正的加号,可能需要编码为 %2B。
另外,非 ASCII 字符,比如中文,通常会被转换成 UTF-8 编码,然后每个字节用 % 后面跟两位十六进制数表示。比如,“你好” 会被编码为 % E4% BD% A0% E5% A5% BD。
总结
支持的字符(无需编码)
- 字母:
A-Z
、a-z
- 数字:
0-9
- 特殊符号:
-
、_
、.
、~
需编码的字符
保留字符:在 URL 中有特殊含义,若作为参数内容需编码:
: / ? # [ ] @ ! $ & ' ( ) * + , ; = %
常见编码示例:
- 空格 →
%20
或+
(但+
本身需编码为%2B
) &
→%26
(分隔符冲突)=
→%3D
(键值对分隔符冲突)?
→%3F
(查询起始符冲突)#
→%23
(片段标识符冲突)
其他字符:
- 非 ASCII 字符(如中文)→ UTF-8 编码后百分比转义,例:
你好
→%E4%BD%A0%E5%A5%BD
。 - 控制字符、Unicode 字符等均需编码。
编码规则
- 保留字符:若在参数值中出现且不表示其原生语义,必须编码。
- 非保留字符:无需编码。
- 空格处理:编码为
%20
或+
(后者仅在查询部分允许,解码时转为空格)。 - 特殊场景:
+
在值中需编码为%2B
,避免被解析为空格。%
需编码为%25
(因其为编码标识符)。