Base64 编解码
编码UTF-8 安全的 Base64 编码与解码,可选 URL 安全变体。
本页内容
什么是 Base64?#
Base64 是一种把任意字节写成纯可打印字符的办法,只用到 64 个 ASCII 字符(A-Z、a-z、0-9、+、/,外加 = 作填充)。它之所以存在,是因为计算世界里大量通道本来就是按文本设计的——邮件正文、JSON 字段、HTTP 头、data URI 前缀——这些通道一旦撞上原始字节(尤其是高位被置 1 的字节或夹在里面的控制字符)就会出问题。当你需要让一段”二进制形状”的数据穿过一个”只认文本”的通道时,base64 就是那门通用语。
每 3 个输入字节(24 位)会被编成 4 个 base64 字符(每个字符承载 6 位)。这也是为什么 base64 的输出长度永远是 4 的倍数,以及为什么它比原始字节大约长 33%——这份冗余就是”可打印”的代价。当输入长度不是 3 的倍数时,结尾就会出现 1 个或 2 个 = 作为填充。
本页的编码和解码对 UTF-8 安全。这里有个常见坑:直接把字符串丢给 btoa(),只要里面有一个非 ASCII 字符(é、中文、emoji)就会抛 InvalidCharacterError。正确的做法是先把文本按 UTF-8 编码成字节,再 base64——本工具正是这么做的,所以 café 能正确往返,而不会中途报错。
怎么使用#
- 用工具栏左上角的 编码 / 解码(Encode / Decode)开关选好方向。
- 在左侧 输入 框里输入或粘贴内容。
- 编码 模式下,输入按 UTF-8 文本处理。
- 解码 模式下,输入应当是一段 base64 字符串,允许其中夹带空白。
- 勾选 URL-safe,如果你需要的是 base64url 字母表(用
-和_代替+和/,并去掉填充)。JWT 和不少签名 URL 方案用的就是它。 - 右侧 输出 框会实时显示结果,点 复制(Copy)即可取走。
- 点 示例(Sample)载入一对演示数据,点 清空(Clear)重置两边。
主要特性#
- 双向 UTF-8 安全。 编码时先走
TextEncoder,多字节字符不会炸;解码时再走TextDecoder,原文一字不差地还原。 - 标准与 URL-safe 两种字母表。 一个复选框在经典 base64(
+/=)和 base64url(-_、无填充)之间切换,解码时还会自动补回缺失的填充位。 - 纯客户端。 转换只在你浏览器里跑——没有后端,不发网络请求。在这里粘贴敏感 token 不会把它送出去。
- 实时状态栏。 两框下方的状态条会报出编码/解码错误(比如输入里混进了
%之类、或者被截断了),而不是悄悄吐出一堆乱码。
实例演示#
选 编码、不勾 URL-safe,ASCII 文本 Hello, World! 的结果是:
SGVsbG8sIFdvcmxkIQ==
结尾那两个 = 说明 13 字节的输入不是 3 的倍数——这很正常,不是错。
只要离开 ASCII,UTF-8 处理的价值就显出来了。编码 café(其中 é 是两个 UTF-8 字节 c3 a9)得到:
Y2Fmw6k=
如果你在控制台里直接 btoa("café"),它会抛错。本工具不会,因为它先做了 UTF-8 字节编码。
URL-safe 模式会改写字母表,让输出里不再出现会被 URL 误读的字符:+ 变 -、/ 变 _,末尾的 = 填充被去掉(解码时自动补回)。拿上面那条标准输出 SGVsbG8sIFdvcmxkIQ== 来说,URL-safe 下那两个填充 = 被去掉,变成 SGVsbG8sIFdvcmxkIQ。+// → -/_ 的替换只有在这些字符真的出现时才会生效,而它们通常出现在二进制载荷里——哈希摘要、随机 token——恰恰是你最常直接塞进 URL 路径段或查询参数的那种数据。
常见问题#
解码出来的文本是乱码,怎么回事?#
十有八九,你解码的那段 base64,原始字节是用别的字符集(常见的是 Latin-1 或 Windows-1252)编码的,而不是 UTF-8。本工具按 UTF-8 解码字节,所以一个 Latin-1 的 é(单字节 0xe9)不是合法 UTF-8,显示出来就是错的。先搞清楚对方当初是用什么字符集编码的,或者先把原文重新按 UTF-8 编码。
标准 base64 还是 base64url,到底用哪个?#
不进 URL 的场景——邮件附件、data: URI、承载二进制的 JSON 字段——用标准形式(+/=)就好。只要输出要进 URL 的路径、查询串,或者塞进 JWT 段里,+、/、= 要么会破坏解析、要么会在传输中被改写,这时勾上 URL-safe。解码时两种格式都会被自动识别。
为什么编码出来比我输入的还长?#
这是 base64 的固有特性,不是 bug。每个字符只装 6 位而不是 8 位,所以输出大约是输入的 4/3——差不多 33% 的膨胀。对很短的输入,因为固定结构占比大,看上去还会更长一点。
这个工具能”解密”或”破解”一段 base64 吗?#
不能——base64 是编码,不是加密。它本身设计成完全可逆,也没有密钥,谁拿到字符串都能解开。如果你要的是保密,先用一个带认证的加密方案加密,再把密文 base64 一下方便传输。