使用方法
- 输入或粘贴要编码的文本;如需编码原始字节,可将输入切换为十六进制;也可以点击“打开文件”编码文件。
- 除非接收方要求其他字符集,否则“文本编码”保持默认的 UTF-8 即可。
- 设置选项:大多数场景使用“标准”变体;接收方不需要填充时关闭“填充”;需要时选择每 76 个字符(MIME)或 64 个字符(PEM)换行。
- 复制 Base64 结果,或将其下载为文件。
Base64 编码的原理
编码器每次读取 3 个字节,把这 24 位拆成 4 组,每组 6 位。每个 6 位数值(0 到 63)对应一个字符:0 到 25 是 A-Z,26 到 51 是 a-z,52 到 61 是 0-9,最后两个是 + 和 /。输入 3 个字节,输出 4 个字符,所以 Base64 结果比原始数据大约多出 33%。
文本 M a n
字节 77 97 110
二进制 01001101 01100001 01101110
6 位分组 010011 010110 000101 101110
索引 19 22 5 46
Base64 T W F u
填充与输出长度
如果输入长度不是 3 的整数倍,最后一组就不完整:剩 1 个字节时输出 2 个字符加 ==,剩 2 个字节时输出 3 个字符加一个 =。因此,带填充的输出长度总是 4 × ceil(n / 3),其中 n 是输入的字节数。
填充本身不携带任何数据。JSON Web Token、URL 参数和许多 API 都不使用填充,如果接收方要求无填充的结果,关闭“填充”即可。用于链接或文件名时,请选择 URL 安全变体,或直接使用 Base64URL 页面,它会用 - 和 _ 代替 + 和 /。
MIME 与 PEM 的换行
默认输出是一整行,这正是 JSON、Data URI 和 HTTP 头所需要的格式。但有两种格式要求换行:
- MIME,每行 76 个字符。使用
Content-Transfer-Encoding: base64发送的邮件附件,每行不得超过 76 个字符(RFC 2045)。该选项按 MIME 的要求使用 CRLF 换行。 - PEM,每行 64 个字符。位于
-----BEGIN和-----END之间的证书和密钥采用每行 64 个字符的格式(RFC 7468)。该选项使用 LF 换行。
字符集与文件
Base64 编码的对象是字节而不是文字,所以文本要先按某种字符集转换成字节。比如字母 é 在 UTF-8 中占 2 个字节,在 ISO-8859-1 或 Windows-1252 中只占 1 个字节,同样的文本就会得到不同的 Base64。网页、JSON 和几乎所有现代 API 都应使用 UTF-8;只有在对接旧系统时,才需要选择 GBK、Shift_JIS、Windows-1251 等字符集。
文件会按原始字节编码,不做任何字符集转换。如果需要带 HTML 和 CSS 代码片段的图片编码,请使用 图片转 Base64;如果需要带有自动识别 MIME 类型的 Data URI,请使用 文件转 Base64。
编码规格
| 字母表 | A-Z a-z 0-9 + / |
|---|---|
| 输出体积 | 每 3 字节输出 4 个字符(约 133%) |
| 填充 | 用 = 补足到 4 的倍数 |
| 标准 | RFC 4648 第 4 节 |
| 区分大小写 | 是 |
编码示例
| 输入 (UTF-8) | 输出 |
|---|---|
Hello, World! | SGVsbG8sIFdvcmxkIQ== |
Base64.is | QmFzZTY0Lmlz |
你好 | 5L2g5aW9 |
常见问题
为什么我的 Base64 结果和其他工具不一样?
echo 会自动添加,可改用 printf '%s' 或 echo -n)、字符集不同、文本中带有 Windows 换行符,或者填充、字母表、换行设置不同。相同的字节配合相同的选项,结果一定相同。在 JavaScript 中如何对中文等 Unicode 文本进行 Base64 编码?
btoa() 只接受 U+00FF 以内的字符,遇到中文会直接报错。需要先转换为 UTF-8 字节,例如 btoa(String.fromCharCode(...new TextEncoder().encode(str)))。在 Node.js 中可以使用 Buffer.from(str, 'utf8').toString('base64')。如何在命令行中进行 Base64 编码?
printf '%s' '你的文本' | base64。GNU base64 默认每 76 个字符换行(加 -w 0 输出单行),openssl base64 默认每 64 个字符换行(加 -A 输出单行)。Base64 编码算是加密吗?
Base64 编码后数据会变大多少?
每 3 个字节变成 4 个字符,最后不足一组时补齐,因此输出大约比原数据大 33%。如果按 MIME 换行,每 76 个字符还会再多出 2 个字节(CRLF)。