Base64 编码 / 解码
在浏览器中即时进行 Base64 转换。附自动计算 — 适用于 data URI 和 API 测试。
完全免费
无需注册
浏览器内完成
5 种语言
深色模式
如有问题或显示异常,请通过以下方式联系我们: 联系表单 — 我们利用反馈改进。
📖 常见的坑
把文本或文件转换为 Base64,也支持反向解码,并提供 URL-safe 形式与旧式 MIME 每 76 字符换行。处理全部在浏览器内完成。Base64 是一种「只用 64 个 ASCII 字符表示字节序列」的编码,既不是加密也不是压缩。任何人一秒钟就能还原,而且数据量必定增加约 33%。实务中的事故,几乎全都始于把这两点搞混。
| 情形 | 会发生什么 | 怎么处理 |
|---|---|---|
| 一遇到非 ASCII 文本就乱码或抛异常 | Base64 处理的是字节序列,而非字符。把字符变成字节的那一步——也就是选定字符编码——发生在 Base64 之外,发送方与接收方在这一点上不一致,文本就会乱掉。浏览器的 btoa() 只接受 Latin-1 范围,因此传入中文或日文会抛出 InvalidCharacterError。而 PHP 的 base64_encode() 会原样编码传入的字节,源数据若是 Shift-JIS,进去的就是 Shift-JIS——正因为它不报错,反而更危险。 |
编码之前先转成 UTF-8 字节序列。在 JavaScript 中,用 new TextEncoder().encode(str) 得到 Uint8Array 再编码,解码时用 new TextDecoder().decode(bytes) 还原。只要这一来一回是对称的,任意两种语言之间都不会乱码。数据要跨系统传递时,请在 API 文档里注明「Base64 的内容是 UTF-8」——字符编码无法从 Base64 字符串本身推断出来,你不写,对方就只能靠猜。 |
| 放进 URL 或查询串就坏掉 | 标准 Base64 使用的 +、/、= 在 URL 中都另有含义。最危险的是 +,查询串会把它解读为空格,解码后值就坏了。麻烦之处在于故障看上去像是概率性的:输出里是否出现 + 取决于输入,于是表现为测试全过,上线后只有某一条特定数据失败。/ 会与路径分隔符冲突,= 会与参数赋值冲突。 |
要放进 URL,就使用 URL-safe 形式——把 + 换成 -、/ 换成 _,并去掉末尾的 =(RFC 4648 的 base64url)。JWT 正是以此形式标准化的,因此手工拼装 JWT 时别无选择。拿不准时,请一开始就选 URL-safe,而不要把标准 Base64 再做一次 URL 编码——双重编码往往只解开一层,数据里就莫名其妙留着一个 %2B。去掉填充用的 = 不影响解码,因为长度本身就能确定它。 |
| 用 data URI 内嵌之后反而更慢了 | 请求数确实减少了,但数据增加 33%,而且浏览器缓存不再起作用。把图片内嵌进 CSS,样式表本身随之膨胀,而样式表会阻塞渲染,于是首屏更慢。20 张 10KB 的图片,会把原本 20 个并行请求,变成一个 266KB 的阻塞渲染资源。更糟的是,只要换掉其中一张图,整份样式表的缓存就全部失效。自 HTTP/2 起,额外请求的代价已大幅下降,因此「应当减少请求数」这个前提本身就已经过时了。 | data URI 请只用于几 KB 以内的小图标。超过这个量级,就老老实实用 <img> 加载,换取缓存与响应式图片(srcset)的收益,反而更快。内嵌 SVG 时不要转 Base64:SVG 是文本,用 encodeURIComponent 做百分号编码比 Base64 更小,而且 gzip 依然有效。判断标准很简单:比较「这张图多久换一次」与「这份 CSS 要分发多少次」——只有像 logo 这种几乎不变、又全站都用的资源,才适合内嵌。 |
Base64 连混淆都算不上。在配置文件里写 password: cGFzc3dvcmQ=,只是让它一眼看不出来而已,并没有变成秘密。Kubernetes 的 Secret 用的正是这种形式,那是编码而非加密——任何能看到 kubectl get secret -o yaml 输出的人都能解开(所以才要另行叠加外部密钥管理与静态加密)。GitHub 的密钥扫描与各类泄露检测都会展开 Base64 查看内容,提交进仓库照样会被检出。反过来说,凡是有人以「已经 Base64 过了所以没问题」为由拍板的地方,几乎必定是个漏洞。还有一点:注意换行的处理——电子邮件与 PEM 格式每 64~76 字符换一行,某些实现在不剥除这些换行时解码会报错;反过来,也有老系统拒绝接收挤成一整行的输入。
📖 使用方法
-
1
粘贴输入粘贴原始文本或 Base64 字符串。
-
2
切换方向点击编码/解码按钮切换。
-
3
选择 URL-safe 变体用于 URL 或 JWT 时选择 URL-safe。
❓ 常见问题
为什么 Base64 会增大 33%?
3 字节(24 位)被表示为 4 个 6 位字符。
可以处理二进制文件吗?
是。拖放文件即可作为二进制处理。
数据会发送吗?
不会。完全在浏览器中处理。
换行符如何处理?
保留输入的换行符。
🐛 此工具出现问题了吗?
免费、无需注册。仅提供复现步骤也有帮助。报告将直接发送给运营者并用于改进。
✅
感谢您的反馈!
已送达运营者,将用于改进工具。