跳到主要内容
浏览器
导航

url-codec

URL 编解码

演示百分号编码规则,区分路径、查询串与表单三种编码集合的差异。

技术说明

URL 只能使用 ASCII 字符集中的一部分字符直接表示,其余字符需要转换为百分号编码,即用 % 加上两个十六进制数字表示该字符的字节值。中文通常以 UTF-8 编码后再逐字节转义,因此一个汉字会展开为三个百分号序列。

RFC 3986 把字符划分为保留字符与非保留字符。保留字符在 URL 中具有语法含义,例如 ? 用于分隔查询串、& 用于分隔参数、# 用于标识片段。编码时需要区分场合:路径段中的 / 通常不应转义,而查询串中的 & 必须转义。

另一处常见差异是空格的处理。application/x-www-form-urlencoded 类型的表单把空格编码为加号,而标准百分号编码把它编码为 %20。两者不能混用,否则参数值会出现偏差。

常见问题

百分号编码的字节数是如何确定的?
取决于字符在所选字符集中的编码长度。以 UTF-8 为例,一个汉字占 3 字节,因此会展开为 3 组百分号序列;ASCII 字符占 1 字节,对应 1 组。
encodeURIComponent 与 encodeURI 有什么区别?
前者会转义所有保留字符,适合对单个参数值编码;后者保留 : / ? # & = 等具有 URL 语法含义的字符,适合对整条 URL 编码。
为什么有的 URL 中空格变成了加号?
这是 application/x-www-form-urlencoded 表单编码的规定。在标准百分号编码中空格应写作 %20。解码时若不加区分,含加号的原始值会被误还原为空格。