搜索、参数与 URL 编码

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

搜索夜班乌鸦后,结果表与 GET 查询参数对应

此时浏览器会向服务器发起一个 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)。

百分号编码的过程

以汉字“乌”为例:

  1. 先把“乌”按 UTF-8 编码为字节:
E4 B9 8C
  1. 把每个字节转换成十六进制表示。

  2. 在每个字节前加上 %。

于是:

乌 -> %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 当作完整搜索词。

一个参数还是两个

练习

某搜索接口使用通常的表单查询参数解析规则。地址里的查询字符串为 q=rock%26roll&category=music。

服务端得到的 q 值是什么?提交解码后的原文,不加引号。

提交答案

题解 Hint