一句话定义:URL 编码(Percent-Encoding,也叫百分号编码)是把 URL 里不被允许、或会引发歧义的字符,按字节改写成 %XX 十六进制形式的一套转义规则。
为什么需要它:URL 的字符集很小,基本只容得下字母、数字和少量标点。保留字符(如 & = ? # / :)在 URL 中有固定语法含义,不能随便当普通文本使用;空格、中文、emoji 则干脆不在允许集合里。
做法分两步:先用 UTF-8 把字符转成字节,再把每个字节写成“百分号 + 两位十六进制”。比如中文“你”的 UTF-8 字节是 E4 BD A0,编码后就是 %E4%BD%A0。空格是 0x20,编码成 %20。
一个生活化的比方:URL 像一张只认标准格式的快递单,任何“异形物品”(中文、空格、&)都得先装进统一规格的纸箱(字节),箱子上印编号(%XX)。接收方按编号拆箱还原。没装箱就直接塞,分拣线会把它当成分拣标记。
& 为什么非编不可:查询串里 & 是参数分隔符。你想搜 tom & jerry,直接把原文拼进去,服务端会理解成“参数 q 的值是 tom ,另外还有个叫 jerry 的参数”,搜索词就丢了。所以必须写成 %26。同理 #(锚点)、=(键值分隔)、?(查询开始)作为数据出现时都要编码。
+ 和 %20 的区别(最容易出错的地方):
| 写法 | 含义 | 出现在哪里有效 |
|---|---|---|
%20 | 空格的百分号编码 | 任何位置都认,最通用 |
+ | 空格 | 仅在表单提交格式(application/x-www-form-urlencoded,即查询串和表单体)中被当作空格;在路径里它就是字面加号 |
实践结论:手拼 URL 参数值一律用 %20;想传一个真正的加号,写成 %2B;解析别人的链接时,要按具体上下文判断 + 是否代表空格,不能一概而论。
对从业者的实际意义:
1. 调用搜索、抓取类接口时,中文查询词不编码,轻则返回空结果,重则 404 或参数错位。用现成函数(如 encodeURIComponent、urllib.parse.quote)而不是手拼字符串。
2. 让模型自己拼链接时,把“参数值里的中文、空格、& 先编码”写进指令,能显著减少这类低级错误。
3. 只编码参数值,别编码整条 URL——否则 :// 和 ? 也会被转成 %3A%2F%2F,链接直接失效。
4. 排查时看开头的字节:%E4 一类是多字节中文被拆开,通常是编解码字符集不一致(如按 GBK 解 UTF-8);出现 %25 说明 % 本身被编码了,多半是重复编码。
5. 各家语言与框架对非法字符的宽容度不同,具体行为以官方文档为准。
