首页文本与开发 › URL 编码 / 解码

URL 编码 / 解码

网址或参数的百分号编码与解码,支持 encodeURIComponent、encodeURI 与解码三种方式。

三种编码方式有什么区别

URL 只允许 ASCII 字母、数字和少数符号,其他字符必须按 UTF-8 拆成字节,每个字节写成“% + 两位十六进制”,这叫百分号编码。一个汉字在 UTF-8 里占 3 个字节,所以“北京”会变成 %E5%8C%97%E4%BA%AC,长度增加到 9 倍。

encodeURIComponent 编码最彻底,只保留字母、数字和 - _ . ! ~ * ' ( ),连 / ? & = # : 都会被编码,适合处理单个参数值,例如把用户输入拼进 ?q= 后面,否则输入中的 & 会把参数截断。encodeURI 用于整条网址,它额外保留 ; / ? : @ & = + $ , # 这些 URL 结构字符,只编码空格、中文和引号等,保证网址结构不变。decodeURIComponent 把百分号序列还原成原文,遇到 %E5 这种不完整或非法的序列会抛出 URIError。

+ 号与 %20 的问题

空格有两种写法:标准百分号编码是 %20;而 HTML 表单以 application/x-www-form-urlencoded 提交时,空格会被写成 +,加号本身则编码成 %2B。JavaScript 的 encodeURIComponent 只输出 %20,不会生成 +;decodeURIComponent 也不会把 + 还原成空格。如果你解码表单数据或某些搜索链接时发现空格变成了加号,勾选“空格与 + 互转”即可。反过来,如果参数值本身含有加号(如手机号 +86),必须编码为 %2B,否则服务端会解析成空格。

使用时的两个常见坑:一是重复编码,已经编码过的 %E5 再编码一次会变成 %25E5,解码一次不够;二是在浏览器地址栏复制的网址通常已被自动编码,粘贴到聊天软件时又被显示成中文,两种形式在服务器看来是同一个地址。

常见问题

中文网址为什么会变成 %E5%8C%97 这种形式?

这是中文按 UTF-8 拆成字节后的百分号编码,每个汉字 3 字节对应 3 个 %XX。浏览器和服务器都能识别,只是不便阅读。

参数值里有 & 或 = 该怎么办?

用 encodeURIComponent 编码后再拼进网址,& 变成 %26,= 变成 %3D,服务端解码后能正确取回原值。

解码时提示 URIError 怎么办?

说明文本里有不完整的百分号序列(如单独的 % 或 %E5 后面缺字节),或者是 GBK 编码的旧网址。请检查是否复制完整,GBK 网址需用其他工具按 GBK 解码。

什么时候用 encodeURI?

当你有一整条包含中文路径或空格的网址,想让它在任何地方都能点击时用 encodeURI;只处理某个参数值时用 encodeURIComponent。