URL 编码是什么?%20、%E4%B8%AD 这类字符解释
网址里突然冒出 %20、%E4%B8%AD 这类字符,不是乱码,而是 URL 编码的正常结果。URL 编码(又叫百分号编码)是指把网址里不能直接出现的字符按 UTF-8 转成「%」加两位十六进制的形式——空格变 %20,中文「中」变 %E4%B8%AD,好让浏览器和服务器不会误读链接结构。它和 Base64 是两回事,也分 encodeURI 与 encodeURIComponent 两种范围。用 URL 编码/解码 能在浏览器本地把这些字符互相转换,内容不上传。
- URL 编码把网址里不安全的字符转成「%」加两位十六进制,例如空格 %20、问号 %3F。
- %E4%B8%AD 这类三段结构是一个中文字,按 UTF-8 每个汉字占 3 个字节、写成 3 段 %xx。
- encodeURIComponent 转义更彻底,用于单个参数值;encodeURI 保留 :/?#& 分隔符,用于整条网址。
- URL 编码不是 Base64:前者为了让字符安全进网址,后者为了把二进制变成可打印文本。
- 多数时候浏览器会自动编码;手工拼接网址、写脚本、参数含中文或特殊符号时才需要手动编码。
URL 编码是什么?%xx 百分号编码解释
URL 编码是把网址里不能直接出现的字符,转成「%」加两位十六进制的表示方法,所以又叫 百分号编码(percent-encoding)。它让空格、中文、& ? # 等字符也能安全地待在网址里。
URL 编码:按 RFC 3986,把不属于「未保留字符」(A–Z a–z 0–9 和 - _ . ~)的字节,逐个写成%加该字节的两位十六进制值,例如空格的字节 0x20 编码为%20。
为什么网址需要编码
网址是有结构的:? 分隔路径和参数、& 分隔多个参数、# 引出锚点。如果参数值里本身就带这些符号,或带空格、中文,浏览器就会 分不清哪里是结构、哪里是内容。编码的作用就是把「内容里的特殊字符」换成 %xx, 让它们不再被当成结构符号。
%xx 是怎么算出来的
先把字符按 UTF-8 变成字节,再把每个字节写成 %加两位十六进制。以空格为例:它的编码是十进制 32,换成十六进制是 20,于是空格就成了 %20。英文字母、数字和 - _ . ~ 属于安全字符,不会被编码,所以 hello 编码后还是 hello, 只有特殊字符才会变。
%20、%E4%B8%AD 这类字符是什么意思
它们都是编码结果,不是乱码。%20 是一个空格;%E4%B8%AD 是一个中文字「中」——三段 %xx 合起来才是一个汉字,因为一个汉字在 UTF-8 里占 3 个字节。
常见 %xx 速查对照
| 原字符 | URL 编码 | 常见场景 |
|---|---|---|
| 空格 | %20(表单里也可能是 +) | 搜索关键词、带空格的文件名 |
| ? 问号 | %3F | 参数值里本身含问号 |
| & 与号 | %26 | 参数值含 &,避免被当成参数分隔 |
| = 等号 | %3D | 参数值含等号 |
| / 斜杠 | %2F | 参数值里的路径片段 |
| 中(中文) | %E4%B8%AD | 网址含中文关键词 |
为什么中文是三段 %E4%B8%AD
关键在 UTF-8:常用汉字在 UTF-8 里编码成 3 个字节,每个字节各写一段 %xx,于是「中」就是 %E4、%B8、%AD 三段拼起来。emoji 往往占 4 个字节,会变成 4 段。这也解释了为什么 一段看似很长的 %xx 串,解码后可能只是几个字——它是按字节数、不是按字数展开的。 乱码通常另有原因:编码用的不是 UTF-8(比如老系统用 GBK),或者解码端按错误编码去读。
encodeURI 和 encodeURIComponent 区别
两者都做 URL 编码,区别在「转义范围」:encodeURI 保留 : / ? # & = 这些网址分隔符, 适合编码整条网址;encodeURIComponent 连分隔符也转义,适合编码单个参数值。
两个函数分别保留什么
- encodeURI:把整条网址当结构看,保留
: / ? # & = +等,只编码空格、中文等,编码后链接仍能正常访问。 - encodeURIComponent:把内容当纯文本看,连
? & = /也编成 %xx,确保参数值里的符号不会破坏链接结构。
该编码整条网址还是单个参数
判断框架:看你要转义的东西「会不会作为 key=value 里的 value」。是参数值 → 用 encodeURIComponent;是一整条网址 → 用 encodeURI。举个实例,把 https://a.com/s?q=中 & 你 里的关键词「中 & 你」拼进 q,如果误用 encodeURI,中间的 & 不会被编码,服务器会把它当成两个参数的分隔符,搜索词就断了; 用 encodeURIComponent 把 & 编成 %26,关键词才完整。拿不准时用 URL 编码/解码 切到 component 范围最稳妥。
URL 编码和 Base64 编码有什么区别
它们常被搞混,但目的完全不同:URL 编码是为了让特殊字符安全进网址,Base64 是为了把 二进制数据变成可打印文本。前者结果里带很多「%」,后者是一串连续的字母数字。
目的与形态不同
URL 编码只动少数不安全字符,安全字符原样保留,所以英文网址编码后基本没变;Base64 则把所有原始字节重新编排成 A–Z a–z 0–9 加 + / 的字符集,任何输入都会被整体重写, 体积约增加三分之一。想深入了解后者,可以看 图片和文件转 Base64 怎么用。
两种编码对照
| 维度 | URL 编码(百分号编码) | Base64 编码 |
|---|---|---|
| 解决的问题 | 特殊字符安全放进网址 | 二进制安全放进文本环境 |
| 典型结果 | %20、%E4%B8%AD(带 % 号) | 5L2g5aW9(连续字母数字) |
| 体积变化 | 只有特殊字符变长 | 整体约增加三分之一 |
| 常见场景 | 网址传参、查询字符串 | 图片内嵌、文件转文本、接口字段 |
两者都不是加密:URL 编码和 Base64 都能被任何人一键还原,别拿它们当保护敏感信息的手段。
什么时候需要手动做 URL 编码
在地址栏点链接、提交表单时,浏览器会自动编码,一般不用管。真正需要手动编码的,是你 用代码或工具「自己拼网址」的时候。
需要手动编码的几种场景
- 脚本拼接网址:用代码把变量拼进 URL,参数值含中文、空格或符号时要先编码。
- 生成分享/跳转链接:把一整条目标网址作为参数塞进另一条链接(redirect 回跳),这个值必须整体 encodeURIComponent。
- 调接口传参:查询参数里带 & = ? # 等符号时,不编码会破坏参数边界。
- 手动核对乱码:网址显示成 %xx 想确认原文,或反过来想知道某个字的 %xx。
双重编码这个坑要避开
最常见的踩坑是「双重编码」:对一段已经编码过的内容再编码一次,% 会被再编成 %25,于是 %20 变成 %2520,解码时多还原一层才对。判断办法是先解码一次看 结果是否正常:若解出来还是一串 %xx,说明被编了两次。用 URL 编码/解码 的「⇄ 反向验证」把结果回填,能快速核对编解码是否一一对应,避免多编或少编一层。
常见问题
- URL 里的中文为什么会变成 %E4%B8%AD
- 因为网址只能安全地使用英文字母、数字和少量符号,中文必须先按 UTF-8 编码再做百分号转义。以「中」为例,它的 UTF-8 字节是 E4 B8 AD 三个字节,每个字节写成「%」加两位十六进制,就拼成了 %E4%B8%AD。这是编码结果、不是乱码,用 URL 编码/解码工具解码就能还原成「中」。
- %20 是什么意思?是空格吗
- %20 就是空格的 URL 编码。空格的字符编码是十进制 32、十六进制 20,所以在网址里写成 %20。在查询参数(application/x-www-form-urlencoded)里空格也可能被写成加号 +,两种都表示空格;标准 URL 路径里则统一用 %20。
- encodeURI 和 encodeURIComponent 用哪个
- 编码「一整条网址」用 encodeURI,它会保留 : / ? # & 这些分隔符不动;编码「单个参数的值」用 encodeURIComponent,它连分隔符也一并转义。判断方法很简单:如果你要转义的内容会作为某个 key=value 里的 value,就用 encodeURIComponent,否则会把 & = 也编进去破坏链接。
- URL 编码和 Base64 编码有什么不同
- 目的不同。URL 编码是为了让特殊字符能安全放进网址,只转义少数不安全字符,结果里带很多「%」;Base64 是为了把二进制数据变成可打印文本,会把所有内容重编成 A–Z a–z 0–9 加 + / 的字符集,体积约增加三分之一。网址传参用 URL 编码,图片、文件内嵌进文本用 Base64。
- 什么时候需要手动对网址做 URL 编码
- 在地址栏正常点链接时浏览器会自动编码,一般不用管。需要手动编码的场景是:用代码或脚本拼接网址、把含中文或空格的关键词放进查询参数、生成分享链接、调用接口时参数里带 & = ? # 等符号。这些情况不编码会让链接断在特殊字符处。
- URL 编码后的中文怎么解码还原
- 把带 %xx 的字符串放进 URL 编码/解码工具、选「解码」即可还原。它会按 UTF-8 把每组 %xx 拼回原字符,中文、emoji 都能正确还原。若解码报错,多半是序列不完整(如单独的 % 或 %zz),或原文并不是合法的 URL 编码。
- 加号 + 在 URL 编码里代表空格吗
- 看它出现在哪里。在表单提交和查询字符串(application/x-www-form-urlencoded)里,+ 表示空格;在标准 URL 的路径部分里,+ 就是普通加号、空格要写成 %20。所以解码前先分清是查询串还是路径,用 URL 编码/解码工具时可勾选「空格按 +」来匹配表单格式。
看懂 %20、%E4%B8%AD 之后,遇到需要转换的网址直接去 URL 编码/解码 粘进去,选编码或解码、选好范围就能一次转好;如果要处理的是图片、文件转文本,则用 Base64 编码/解码,两者用途不同别混用。
参考资料
延伸阅读
本文由「小鹿tools」整理,更新于 2026-08。如发现信息过期或有误,欢迎反馈。