回到笔趣城首页,在搜索框中输入作者“夜班乌鸦”,然后点击“搜索”。

此时浏览器会向服务器发起一个 GET 请求。
在 Network 面板中,你看到的请求地址可能显示为:
GET /?q=夜班乌鸦 HTTP/1.1
但真实传输时,中文字符通常会被编码成:
GET /?q=%E5%A4%9C%E7%8F%AD%E4%B9%8C%E9%B8%AD HTTP/1.1
这背后涉及 URL 参数和 URL 编码两个概念。
查询参数从哪里来
URL 中 ? 后面的部分称为查询字符串(Query String)。
例如:
/?q=夜班乌鸦
其中:
q是参数名夜班乌鸦是参数值
在 HTML 表单中,搜索输入框通常类似这样:
<input name="q">
浏览器提交表单时,会把输入框里的内容按照参数名 q 放到查询字符串中。
如果有多个参数,就用 & 连接:
/?q=夜班乌鸦&category=都市
这表示:
- 参数
q的值是夜班乌鸦 - 参数
category的值是都市
中文为什么会变成一串 %
URL 并不能直接安全地包含所有字符。 为了在网络中稳定传输,URL 需要限制为一部分 ASCII 字符。
当参数值里出现中文、空格、&、=、# 等特殊字符时,浏览器通常会对其进行 URL 百分号编码(Percent-Encoding)。
百分号编码的过程
以汉字“乌”为例:
- 先把“乌”按 UTF-8 编码为字节:
E4 B9 8C
-
把每个字节转换成十六进制表示。
-
在每个字节前加上
%。
于是:
乌 -> %E4%B9%8C
再比如:
夜 -> %E5%A4%9C
班 -> %E7%8F%AD
乌 -> %E4%B9%8C
鸦 -> %E9%B8%AD
所以“夜班乌鸦”会被编码为:
%E5%A4%9C%E7%8F%AD%E4%B9%8C%E9%B8%AD
特殊符号为什么必须编码
百分号编码不仅用于中文,也用于那些在 URL 中有特殊含义的字符。
| 原始字符 | 百分号编码 | 为什么需要编码 |
|---|---|---|
| 中文“乌” | %E4%B9%8C | 中文字符不属于 URL 可直接安全传输的 ASCII 字符 |
| 空格 | %20 | 空格可能破坏请求行或查询字符串边界 |
& | %26 | & 是查询参数分隔符,不编码会被误解为多个参数 |
= | %3D | = 是键值分隔符,出现在参数值中时必须转义 |
? | %3F | ? 是查询字符串起始符 |
# | %23 | # 表示 URL 片段,片段部分通常不会被发送给服务器 |
例如,如果你想搜索包含 & 的内容:
A&B
如果直接写成:
/?q=A&B
服务器可能会理解为:
参数 q = A
参数 B = 空
这显然不是我们想要的。
正确做法是把 & 编码为 %26:
/?q=A%26B
这样服务器才能把 A&B 当作完整搜索词。

