URL 编码
URL 编码(又称百分号编码、percent-encoding、urlencode)是一种把 URL 中不能直接出现的字符转换成安全形式的机制。规则很简单:将字符对应的字节写成 % 加两位十六进制,例如空格变成 %20,中文「你」的 UTF-8 字节被编码为 %E4%BD%A0。这样任意文本都能放进 URL 而不破坏其结构。
需要编码的主要是两类字符:一是保留字符(在 URL 里有特殊语义),二是非 ASCII 字符。几个要点:
- 保留字符如
/ ? # & = +,若作为普通数据出现就必须编码,否则会被解析器当成分隔符。 - 非 ASCII 字符(如中文)应先按 UTF-8 转成字节,再逐字节做百分号编码。
- 空格有两种写法:一般场景是
%20,而表单提交(application/x-www-form-urlencoded)里是+。
常见误区是对整条 URL 无差别编码。以 JavaScript 为例,encodeURI 会保留 / ? & 等结构字符,适合处理完整 URL;而 encodeURIComponent 会连它们一起编码,只适合编码单个参数值。用错会导致链接损坏或参数解析出错。
常见问题
encodeURI 和 encodeURIComponent 有什么区别?
encodeURI 用于整条 URL,会保留 : / ? # & = 等结构字符;encodeURIComponent 用于单个参数值,会把这些字符也一并编码。拼接查询参数时应该用后者,否则 & 或 = 会破坏参数结构。
空格该编码成 %20 还是 +?
取决于场景。URL 路径和标准百分号编码里空格是 %20;而 application/x-www-form-urlencoded 表单数据里空格是 +。两者别混用,否则解码时 + 可能被错误还原成空格。
中文等非 ASCII 字符怎么编码?
现代规范是先把字符按 UTF-8 编成字节序列,再对每个字节做百分号编码,所以一个中文通常变成三段 %XX。解码时也必须按 UTF-8 还原,字符集用错就会出现乱码。