Base64 编码:文本和文件转 Base64

把文本、原始字节或任意文件转换为 Base64。可以按接收方的要求选择字符集,保留或去掉 = 填充,并按 MIME 或 PEM 格式每 76 或 64 个字符换行。

完全在浏览器中运行,不会上传任何数据。

使用方法

  1. 输入或粘贴要编码的文本;如需编码原始字节,可将输入切换为十六进制;也可以点击“打开文件”编码文件。
  2. 除非接收方要求其他字符集,否则“文本编码”保持默认的 UTF-8 即可。
  3. 设置选项:大多数场景使用“标准”变体;接收方不需要填充时关闭“填充”;需要时选择每 76 个字符(MIME)或 64 个字符(PEM)换行。
  4. 复制 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.isQmFzZTY0Lmlz
你好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 编码?
在 Linux 或 macOS 上运行 printf '%s' '你的文本' | base64。GNU base64 默认每 76 个字符换行(加 -w 0 输出单行),openssl base64 默认每 64 个字符换行(加 -A 输出单行)。
Base64 编码算是加密吗?
不算。Base64 没有密钥,任何人都可以用 Base64 解码 工具还原。它的作用是让二进制数据通过只支持文本的渠道传输,而不是隐藏信息。
Base64 编码后数据会变大多少?

每 3 个字节变成 4 个字符,最后不足一组时补齐,因此输出大约比原数据大 33%。如果按 MIME 换行,每 76 个字符还会再多出 2 个字节(CRLF)。