如何把 ASCII 文本编码为 Base64
- 在 输入 · 文本 中输入或粘贴文本。字符集 已预设为 ASCII。
- Base64 会显示在 输出 · Base64 中。如果文本中含有 ASCII 以外的字符,工具下方会出现警告,说明有多少个字符被替换成了
?。 - 删除或替换这些字符;如果接收方支持 UTF-8,也可以把 字符集 切换为 UTF-8。
- 复制结果,或下载为
base64.txt。
反向转换请用 Base64 转 ASCII。
什么算 ASCII
ASCII 定义了 128 个编码,从 0 到 127,每个占一个字节,最高位为 0。编码 32 到 126 是可打印字符:空格、数字、英文字母和常用标点。编码 0 到 31 以及 127 是控制字符,例如制表符(9)、换行符(10)和回车符(13)。
其他任何字符都不是 ASCII,包括 é、ß、€、弯引号、不间断空格和 emoji。从文字处理软件和网页中粘贴的文本常常不知不觉地带着这类字符,典型的是排版用的引号和破折号,替换警告能把它们揪出来。
示例
| 文本 | Base64 | 说明 |
|---|---|---|
Hello, ASCII! | SGVsbG8sIEFTQ0lJIQ== | 与 UTF-8 相同 |
200 OK | MjAwIE9L | 6 个字节,无填充 |
{}[]<> | e31bXTw+ | 标点就是普通的字节 |
a、制表符、b | YQli | 制表符是字节 09 |
line1 CR LF line2 | bGluZTENCmxpbmUy | 中间是 0D 0A |
user:pass | dXNlcjpwYXNz | HTTP Basic 认证凭据 |
Grüße | R3I/P2U= | 2 个字符被替换为 ? |
naïve café | bmE/dmUgY2FmPw== | 2 个字符被替换为 ? |
每个字符编码为一个字节,所以体积也很容易预测:n 个字符得到 4 × ⌈n / 3⌉ 个 Base64 字符。
为什么 ASCII 和 Base64 密不可分
Base64 本来就是为只能安全传输 7 位 ASCII 的通道设计的。早期的电子邮件(SMTP)是经典例子:大于 127 的字节在传输途中可能被去掉或篡改,所以二进制附件和非英文文本都会被编码成所有系统都能处理的 ASCII 子集。这至今仍是 Base64 存在的理由,也解释了它的字母表:64 个可打印字符,在所有源自 ASCII 的字符集中都完全相同,而且除了 + 和 /,都不是常见格式中有特殊含义的字符。Base64 的工作原理详细讲解了其中的机制。
有些系统至今仍只接受 ASCII,例如传统接口和 HTTP 头的值,不同服务器对非 ASCII 字符的处理各不相同。在这里用 ASCII 字符集编码,可以在发送之前确认输入对它们是安全的。如果是 Authorization 请求头,Basic 认证请求头生成器能直接生成完整的 Basic dXNlcjpwYXNz 值。
用代码实现 ASCII 转 Base64
Python 默认会拒绝非 ASCII 字符,这本身就是一种有用的检查:
import base64
base64.b64encode("200 OK".encode("ascii")).decode() # 'MjAwIE9L'
"Grüße".encode("ascii")
# UnicodeEncodeError: 'ascii' codec can't encode characters in position 2-3
"Grüße".encode("ascii", errors="replace") # b'Gr??e', like this tool
在 JavaScript 中,btoa() 接受编码不超过 255 的所有字符,所以它发现不了 ü 这样的 Latin-1 字母。如果字符串必须是纯 ASCII,请先用 /^[\x00-\x7F]*$/.test(s) 检测。更多内容见 Python 和 JavaScript 页面。
常见问题
ASCII 转 Base64 和 UTF-8 转 Base64 有区别吗?
对纯 ASCII 文本没有区别。UTF-8 的设计让前 128 个字符保持 ASCII 的字节值不变,所以 Hello, ASCII! 在两者下都得到 SGVsbG8sIEFTQ0lJIQ==。只有文本中含有其他字符时才会不同。
ü 或 emoji 这样的字符会怎样?
ASCII 中没有它们的编码,所以每个都会变成 ?(字节 3F),工具会报告替换了多少个。Grüße 编码为 R3I/P2U=,解码后是 Gr??e。
Base64 的输出本身是 ASCII 吗?
是的。Base64 用到的全部 65 个字符(A–Z、a–z、0–9、+、/ 和 =)都是可打印的 ASCII 字符,所以 Base64 能通过只能处理 7 位文本的系统。
制表符、换行符这类控制字符能编码吗?
能。它们也是 ASCII(编码 0–31),和其他字节一样编码:a、制表符、b 得到 YQli。