URL 编解码:我终于搞懂了为什么网址里会有 %20 和 %E4%BD%A0
URL 编解码:我终于搞懂了为什么网址里会有 %20 和 %E4%BD%A0
有次对接第三方接口,对方要求把参数放到 URL 路径里,比如
/api/user/张三。我直接拼上去,结果报错 404。排查了半天才发现,“张三”这两个中文字符没有编码,浏览器自动转成了乱七八糟的东西。后来我写了一个 URL 编解码工具,每次调试接口前先编码一遍,省了很多事。这篇文章把 URL 编码的原理、工具用法、以及我踩过的坑分享出来。
本文工具由 VidDown 提供—— 一个完全免费、无需登录、纯前端处理的在线工具集。除了 URL 编解码,还提供视频解析下载、JSON 格式化、PDF 合并、HTTP 状态码检测等 20+ 实用功能。所有操作在浏览器本地完成,不上传任何数据。
🌐 主站:https://viddown.cn
🔧 本文专属工具:URL 编解码工具
一、这个工具能做什么?
URL 编解码工具用于将字符串转换为 URL 安全格式(百分号编码),或反向还原。
- 编码(encodeURIComponent):将特殊字符(中文、空格、&、=、? 等)转换为
%XX格式,便于放入 URL 参数或路径中。 - 解码(decodeURIComponent):将编码后的字符串还原为原始文本。
- 一键复制:编码/解码结果可快速复制到剪贴板。
- 本地处理:所有操作使用 JavaScript 原生方法,不上传服务器。
适用场景:
- 拼接 GET 请求参数时,对参数值进行编码(防止特殊字符破坏 URL 结构)。
- 调试接口时,快速解码后端返回的编码字符串。
- 处理表单数据(
application/x-www-form-urlencoded)。 - 理解浏览器地址栏中
%20等符号的含义。
二、URL 编码是什么?
💡术语解释:URL 编码(也叫百分号编码)是一种将不安全字符转换为
%+ 两位十六进制数的格式。因为 URL 中只允许英文字母、数字、-、_、.、~等少量字符,其他字符(如中文、空格、&、=、#)必须被编码。
常见编码示例:
| 原始字符 | 编码后 | 说明 |
|---|---|---|
| 空格 | %20 | 路径中的空格 |
& | %26 | 参数分隔符 |
= | %3D | 键值对分隔符 |
? | %3F | 查询字符串起始符 |
# | %23 | 锚点标识符 |
| 中文字符“你” | %E4%BD%A0 | UTF-8 三字节编码 |
| 中文字符“好” | %E5%A5%BD | UTF-8 三字节编码 |
两种编码方式
JavaScript 提供两种编码函数,容易混淆:
| 函数 | 编码范围 | 适用场景 |
|---|---|---|
encodeURI | 保留 URL 语义字符(如/、?、&、#不编码) | 编码整个 URL |
encodeURIComponent | 几乎所有非字母数字字符都编码 | 编码 URL 参数值 |
本工具使用encodeURIComponent/decodeURIComponent,因为这是最常用、最安全的参数编码方式。
三、如何使用这个工具?
3.1 编码
- 在输入框中输入原始文本,例如
name=张三&age=18。 - 点击「编码」按钮。
- 输出框显示编码结果:
name%3D%E5%BC%A0%E4%B8%89%26age%3D18。
3.2 解码
- 粘贴一段编码后的字符串,例如
hello%20world%21。 - 点击「解码」按钮。
- 输出框显示原始文本:
hello world!。
3.3 复制与清空
- 点击「复制结果」可将当前输出内容复制到剪贴板。
- 点击「清空」可同时清空输入和输出框。
四、实战场景
场景1:拼接 GET 请求参数
假设要请求https://api.example.com/search,参数keyword的值是手机&电脑(包含特殊字符&)。如果不编码,URL 会变成:https://api.example.com/search?keyword=手机&电脑
服务器会误认为有两个参数:`keyword=手机` 和 `电脑=`(无值)。**正确做法**:对参数值编码。 使用本工具对 `手机&电脑` 编码,得到 `%E6%89%8B%E6%9C%BA%26%E7%94%B5%E8%84%91`。 最终 URL: https://api.example.com/search?keyword=%E6%89%8B%E6%9C%BA%26%E7%94%B5%E8%84%91场景2:路径中包含中文
如果 API 设计为/user/张三,直接拼接会导致浏览器无法识别。对张三编码得到%E5%BC%A0%E4%B8%89,请求/user/%E5%BC%A0%E4%B8%89即可。
场景3:调试时快速解码
后端日志中返回了redirect_uri=https%3A%2F%2Fexample.com%2Fcallback,肉眼很难看出来。粘贴到工具点击「解码」,得到redirect_uri=https://example.com/callback。
五、技术实现:浏览器本地处理
工具使用 JavaScript 原生方法,完全在本地运行,不发送任何数据到服务器。
// 编码functionencode(text){returnencodeURIComponent(text);}// 解码functiondecode(text){returndecodeURIComponent(text);}// 示例constoriginal="name=张三&age=18";constencoded=encodeURIComponent(original);console.log(encoded);// name%3D%E5%BC%A0%E4%B8%89%26age%3D18constdecoded=decodeURIComponent(encoded);console.log(decoded);// name=张三&age=18六、踩坑汇总(我全遇到过)
- 混淆 encodeURI 和 encodeURIComponent
错误:想编码参数值,用了 encodeURI,结果 /、?、& 等字符没有被编码,导致参数结构混乱。 示例: encodeURI("name=张三&age=18") → "name=%E5%BC%A0%E4%B8%89&age=18"(& 没编码) encodeURIComponent("name=张三&age=18") → "name%3D%E5%BC%A0%E4%B8%89%26age%3D18"(正确)解决:编码参数值用 encodeURIComponent;编码整个 URL(包含协议、域名、路径)用 encodeURI。
- 忘记编码导致参数解析错误
现象:用户输入包含 & 或 =,拼接 URL 后后端收到的参数被截断或合并。 解决:永远不要信任用户输入,所有外部数据放入 URL 前必须编码。- 解码时遇到 URIError: URI malformed
原因:输入的字符串不是合法的百分号编码格式,比如 %XX 中的 XX 不是十六进制数,或者 % 后面不足两位。 解决:检查待解码字符串是否被意外截断或多次编码。例如 %25 是 % 的编码,再次解码会报错。- 多次编码导致乱码
现象:对已编码的字符串再次编码,导致 % 被编码成 %25,变成二次编码。 示例: 第一次编码 你好 → %E4%BD%A0%E5%A5%BD 第二次编码 → %25E4%25BD%25A0%25E5%25A5%25BD 解码一次后仍是 %E4%BD%A0%E5%A5%BD,需要解码两次才恢复原文。 解决:调用解码前确认只编码了一次。如果不知道编码次数,可以循环解码直到不再变化(但有风险)。- 服务器端编码与前端不一致
原因:不同编程语言的 URL 编码函数默认字符集不同(PHP 的 rawurlencode 符合 RFC 3986,Java 的 URLEncoder 编码空格为 +)。 解决:统一使用 UTF-8 编码,且前后端约定相同的编码方式(推荐 RFC 3986,空格编码为 %20)。七、与命令行工具对比
| 方式 | 优点 | 缺点 |
|---|---|---|
| 本工具(网页版) | 可视化,无需安装, | 手机可用 依赖网络 |
| python -c “import urllib.parse; print(urllib.parse.quote(‘文本’))” | 脚本批量处理 | 需要 Python 环境 |
| Node.js 命令行 | 灵活 | 需安装 Node |
Python 命令行示例
# 编码python-c"import urllib.parse; print(urllib.parse.quote('你好世界'))"# 输出: %E4%BD%A0%E5%A5%BD%E4%B8%96%E7%95%8C# 解码python-c"import urllib.parse; print(urllib.parse.unquote('%E4%BD%A0%E5%A5%BD'))"# 输出: 你好八、一点小建议
- 永远对用户输入进行编码,无论是 GET 参数还是 POST 表单,防止注入和解析错误。
- 统一使用 encodeURIComponent 而非 encodeURI,除非你明确需要保留 URL 语义字符。
- 解码前确认字符串格式,避免 URIError。
- 使用在线工具验证:在拼接复杂 URL 前,先用本工具测试编码/解码结果。
注意空格:encodeURIComponent 将空格编码为 %20,而 application/x-www-form-urlencoded 表单传统上编码为 +,两者不兼容。现代 API 通常接受 %20。
九、总结
URL 编解码是 Web 开发中最基础也最容易出错的一环。VidDown 的这个工具让你不用写代码就能快速编码/解码,适合调试接口、构造 URL、分析网络请求。
如果你还没试过,现在就去 https://viddown.cn/tools/url-encode/ 体验一下。
下次你手动拼接 URL 遇到乱码时,先停下来,把参数编码再放进去,世界就清净了。
附录:常见字符编码速查表
| 字符 | 编码 | 说明 |
|---|---|---|
| 空格 | %20 | 路径或查询参数中的空格 |
| ! | %21 | 感叹号 |
| " | %22 | 双引号 |
| # | %23 | 锚点标识符 |
| $ | %24 | 美元符号 |
| % | %25 | 百分号本身 |
| & | %26 | 参数分隔符 |
| + | %2B | 加号 |
| = | %3D | 等号 |
| ? | %3F | 查询字符串起始符 |
| @ | %40 | 邮箱中的 at 符号 |
| 中文“你” | %E4%BD%A0 | UTF-8 编码 |
| 中文“好” | %E5%A5%BD | UTF-8 编码 |
版权声明:本文为 VidDown 原创,欢迎分享,请保留出处。
