如何把文本编码为 Base64
- 在 输入 · 文本 框中输入或粘贴文本。页面打开时带有示例内容,按 清空 即可从头开始。
- 输入的同时,Base64 会出现在 输出 · Base64 中。输入特别大时,可以取消勾选 实时,改为按 运行。
- 按接收方的要求设置选项:URL 安全(- _)、不填充(=)、换行 和 字符集。默认设置(标准字母表、带填充、单行、UTF-8)适用于大多数 API。
- 按 复制输出,或按 下载 把结果保存为
base64.txt。 - 想验证能否还原,按 互换。它会把 Base64 移到输入框,并把工具切换为解码。
按钮下方会显示输入的字节数、输出大小和变化百分比,字段有长度限制时很有用。
Base64 编码的原理
Base64 处理的是字节,所以第一步是用某种字符集把文本转成字节(这里默认 UTF-8,除非你另选)。随后编码器每次取 3 个字节,也就是 24 位,拆成 4 个 6 位的数,再把每个数写成 64 字符字母表中的一个字符:A–Z、a–z、0–9、+ 和 /。
经典例子是文本 Man:字节 4D 61 6E 变成 TWFu。最后一组只有一两个字节时,输出用 = 补齐:Ma 变成 TWE=,M 变成 TQ==。完整的推导过程见 Base64 的工作原理,填充详解 则说明了什么时候可以省略 =。
n 个字节的输出长度总是 4 × ⌈n / 3⌉ 个字符,比输入多约 33%。Base64 大小计算器 可以算出任意大小对应的长度,Base64 的体积开销 解释了这在什么时候要紧。任何人都能还原 Base64,它什么也藏不住;往里面放机密信息之前,请先读读 编码与加密的区别。
编码选项
| 选项 | 作用 | 适用场景 |
|---|---|---|
| URL 安全(- _) | + 变成 -,/ 变成 _(RFC 4648 第 5 节) | URL、查询字符串、文件名、Cookie、JWT。Base64URL 编码器 默认开启此项 |
| 不填充(=) | 去掉末尾的 = 字符 | JWT 和大多数 URL 安全格式;以及任何反正会去掉 = 的场合 |
| 换行:76(MIME,LF 或 CRLF) | 每 76 个字符插入一个换行 | 电子邮件正文和附件(MIME 编码器) |
| 换行:64(PEM) | 每 64 个字符插入一个换行 | 位于 -----BEGIN 和 -----END 行之间的证书和密钥 |
| 字符集 | 编码前每个字符变成哪些字节 | 一般用 UTF-8,除非接收方需要 UTF-16、Windows-1251、Shift_JIS 或其他传统编码 |
Unicode、Emoji 和 URL 安全输出示例
下面每个值都是用 Python 的 base64 模块生成的,与本工具的输出一致。
| 输入 | 设置 | Base64 |
|---|---|---|
Hello | UTF-8 | SGVsbG8= |
Hello, world! | UTF-8 | SGVsbG8sIHdvcmxkIQ== |
café | UTF-8 | Y2Fmw6k= |
café | ISO-8859-1 | Y2Fm6Q== |
€ | UTF-8 | 4oKs |
€ | Windows-1252 | gA== |
👋 | UTF-8 | 8J+Riw== |
👋 | UTF-8,URL 安全,不填充 | 8J-Riw |
Привет | UTF-8 | 0J/RgNC40LLQtdGC |
Привет | Windows-1251 | z/Do4uXy |
同一个词在不同字符集下得到不同的 Base64,是因为字节不同:é 在 UTF-8 中是两个字节(C3 A9),在 Latin-1 中是一个字节(E9)。挥手 Emoji 占 4 个 UTF-8 字节,单独编码需要 8 个字符,其中两个是填充。
字符集与无法表示的字符
UTF-8 能表示所有 Unicode 字符,所以不会丢失任何内容。列表中的其余 26 种字符集(UTF-16LE/BE、UTF-32LE、ASCII、ISO-8859 和 Windows 代码页、KOI8-R/U、CP866、Shift_JIS、EUC-JP、GBK、Big5 和 EUC-KR)是为需要它们的系统准备的。如果文本中有所选字符集没有的字符,它会被替换为 ?,并有警告提示替换了多少个字符。例如 € 在 ISO-8859-1 下编码为 Pw==,其实就是一个问号。
Windows 和 .NET 字符串以及 PowerShell 请选 UTF-16LE,原因见 UTF-16 转 Base64。如果系统必须拒绝 7 位文本以外的任何内容,请选 ASCII(ASCII 转 Base64)。
换行
普通的 Base64 是一整行,JSON、HTTP 请求头、URL 和环境变量需要的正是这种形式。电子邮件使用 76 字符一行(RFC 2045),PEM 文件使用 64 字符一行。换行选项会按该宽度插入 \n 换行符;选择 76 (MIME, CRLF) 时插入的是 CRLF。解码器(包括 本站的解码器)会跳过换行,所以换行后的输出解码出的字节不变。MIME 规则见 电子邮件中的 Base64。
常见的编码错误
- 混入了末尾换行符。
echo Hello | base64输出SGVsbG8K,因为echo会加上\n。单独的文本Hello是SGVsbG8=。请使用printf '%s';在这里粘贴时,也检查一下输入字节数是否符合预期。 btoa()遇到 Unicode 会报错。 在浏览器中,btoa("Grüße 👋")会抛出InvalidCharacterError,因为btoa只接受 Latin-1 字符。请像下面的代码片段那样,先编码成 UTF-8 字节。- 接收方用的是另一种字符集。 你按 UTF-8 编码,对方按 Latin-1 解码,
café就会变成café。事先约定字符集,或者在这里直接选择接收方的字符集。 - 编码了两次。
SGVsbG8=的 Base64 是U0dWc2JHOD0=。如果一个值解码后还是 Base64,说明流程中某一步又编码了一次。 +和/会破坏 URL。 在查询字符串中,+会被当成空格。请使用 URL 安全选项或 Base64URL 编码器,或者对值做百分号编码。
在 JavaScript、Python 和命令行中进行 Base64 编码
在浏览器 JavaScript 中,先用 TextEncoder 把字符串转成 UTF-8 字节,再对字节编码。较新的浏览器可以直接调用 bytes.toBase64()(Uint8Array.toBase64)。
const bytes = new TextEncoder().encode("Grüße 👋");
let bin = "";
for (const b of bytes) bin += String.fromCharCode(b);
btoa(bin); // "R3LDvMOfZSDwn5GL"
// Node.js
Buffer.from("Grüße 👋", "utf8").toString("base64"); // "R3LDvMOfZSDwn5GL"
Buffer.from("👋", "utf8").toString("base64url"); // "8J-Riw"
在 Python 中,b64encode 接收字节并返回字节:
import base64
base64.b64encode("Grüße 👋".encode("utf-8")).decode("ascii")
# 'R3LDvMOfZSDwn5GL'
base64.urlsafe_b64encode("👋".encode()).rstrip(b"=").decode()
# '8J-Riw'
在 Linux 和 macOS 上,base64 命令会编码标准输入:
printf '%s' 'Grüße 👋' | base64
base64 -w 0 file.bin > file.b64
第一条命令输出 R3LDvMOfZSDwn5GL。Linux 上的 GNU base64 默认每 76 列换行,-w 0 可以关闭换行;macOS 版本除非指定,否则不换行。更多语言和边界情况:JavaScript 中的 Base64、Node.js、Python 和 PHP。
图片、PDF 和其他任何文件都可以交给文件编码器处理,支持 data URI 和 JSON 输出。
常见问题
怎样对字符串做 Base64 编码?
把字符串粘贴到上方的输入框,再从输出框复制结果。在代码中,先把字符串转成 UTF-8 字节,再对这些字节编码:Python 用 base64.b64encode(s.encode()),Node.js 用 Buffer.from(s).toString("base64")。
为什么 Base64 结尾会有 = 或 ==?
Base64 以 3 个字节为一组处理数据。输入长度不是 3 的倍数时,最后一组不完整,就用 = 标出缺少的字节:剩 2 个字节补一个 =,剩 1 个字节补 ==。详见 填充详解。
同样的文本,为什么在别处编码出来的 Base64 不一样?
通常是字节层面有看不见的差异:末尾多了换行符(echo 会自动加一个)、字符集不同(UTF-8、Latin-1 还是 UTF-16),或者 Unicode 规范化方式不同。可以对比工具下方显示的输入字节数。
Base64 编码能用来隐藏密码吗?
不能。Base64 没有密钥,任何人一秒钟就能解码。它适合用来传输数据,要保护数据请使用真正的加密或哈希。参见 编码与加密的区别。
文本经过 Base64 编码后会变大多少?
每 3 个字节变成 4 个字符,所以输出大约多 33%,如果换行还要再加上换行符。100 字节的 UTF-8 文本会变成 136 个字符。