URL 编码
编码百分号编码(Percent-encoding)
URL 编码(百分号编码)是 RFC 3986(2005)定义的转义机制,把 URL 中不允许直接出现的字符表示为 %XX 的十六进制字节序列,保证 URL 在各种传输环境中不被破坏。
为什么需要它
URL 只允许一小部分"安全字符"直接出现。空格、中文、&、=、? 等字符要么会改变 URL 结构,要么在老系统间传输时不可靠。百分号编码把每个不安全字节写成 % 后跟两位十六进制,例如空格是 %20,"中"(UTF-8 为 E4 B8 AD)是 %E4%B8%AD。
标准与历史
现行规范是 RFC 3986(2005),前身 RFC 2396(1998)与 RFC 1738(1994)。HTML 表单的默认编码(application/x-www-form-urlencoded)与之近似但有历史差异:空格编码为 + 而不是 %20。这就是 JavaScript 里 encodeURIComponent 与 encodeURI 之外还需要手动替换 +/%20 的原因。
两个 JS 函数的区别
encodeURI 编码整个 URL,保留 : / ? & 等结构字符;encodeURIComponent 只适合编码"值",会把结构字符也转义。把用户输入拼进查询参数时应当用后者,否则 &、= 等字符会破坏参数边界。
常见陷阱
同一字符可能被编码多次(%2520 是 %20 被再次编码的结果),服务端应只解码到语义正确为止;混合 UTF-8 与 GBK 页面时同一中文会产生不同字节序列,跨系统传参必须统一 UTF-8。