Base64 编码解码是最常被搜索、也最容易被误解的一类操作:它把文本或图片换成一串由大小写字母、数字以及加号、斜杠组成的字符,方便塞进网址、JSON、邮件或代码里搬运。把内容粘进来就能立刻编码,反过来把 Base64 字符串还原成原文,也是一步到位。
需要先说明一点:Base64 是编码而不是加密。它只负责换一种写法,谁拿到字符串都能还原出原文,本身没有任何保密作用。下面既讲清楚它怎么用,也讲清楚它的边界在哪里。
Base64 是怎么把 3 个字节变成 4 个字符的
Base64 的核心规则只有一句:每 3 个字节(24 位)一组,重新切成 4 段、每段 6 位,再把这 6 位映射到 64 个可打印字符上(A 到 Z、a 到 z、0 到 9,以及加号和斜杠)。因为 6 位二进制刚好能表示 0 到 63 这 64 个数,一张 64 字符的表就能装下所有组合。3 个字节编成 4 个字符,体积固定膨胀约三分之一,这也是 Base64 字符串看起来比原文更长的原因。
延伸阅读:编码速查表
为什么说 Base64 不是加密,「base64 加密」是误称
Base64 常被叫作「base64 加密」,但它和加密没有半点关系。加密需要一把钥匙,没有钥匙就解不开;Base64 没有钥匙,它只是把数据换了个写法,任何人把字符串贴回来就能原样还原。所以用它来「藏」密码、身份证号是无效的——真正的保密要靠加密算法,而判断数据有没有被改动则要靠哈希。把 Base64 当成一种「能安全放进文本里」的搬运格式就好,别指望它替你保密。
URL-safe 变体:加号和斜杠为什么在网址里会出问题
标准 Base64 的字符表里有两个麻烦字符:加号会被网址理解成空格,斜杠则是路径分隔符,直接放进 URL 参数会解析出错。于是有了 URL-safe 变体:把加号换成减号、把斜杠换成下划线,这样生成的字符串就能安全地放进网址。此外,末尾用来凑满 4 个字符的等号填充,在 URL-safe 场景里往往可以直接省略,解码时再自动补回来即可。
同样一句话,中文转 Base64 为什么变长更多
英文字母在 UTF-8 里占 1 个字节,编码后是 4 个字符,膨胀约三分之一;中文不一样——一个汉字在 UTF-8 里占 3 个字节,经过 Base64 大约变成 4 个字符。所以「你好」两个字在 Base64 里会变成 8 个字符左右,比英文单词膨胀得更明显。这不是工具出错,而是 UTF-8 对非 ASCII 字符本来就用多个字节表示。如果字符集不同(比如 GBK),同一个汉字得到的 Base64 结果也会不一样,解码时要用回同一套字符集才不会乱码。
图片转 Base64:什么时候方便,什么时候不该用
把一张小图标转成 Base64,再以 data 形式直接写进网页或 CSS,可以省掉一次网络请求,页面加载反而更快,这是它最实用的场景。但它不适合大图:Base64 会让体积膨胀约三分之一,还会让 HTML、CSS 文件变得又大又难维护,浏览器也无法像普通图片那样缓存和并行下载。经验是,几 KB 的图标可以用,超过几十 KB 的照片还是当独立图片文件更划算。做前端的同事小周踩过这个坑:他把一张 200KB 的封面图塞进 CSS,样式表涨到 280KB,首屏反而变慢,后来又改回外链。
解码时遇到乱码或报错,先查这几处
解码失败最常见的原因是字符串不完整——少了一段、混进了换行或空格,或者末尾的等号填充被去掉又没让工具自动补齐。另一个原因是字符集对不上:用 UTF-8 编的却按 GBK 解,就会得到一串乱码。还有一种情况是字符串其实来自 URL-safe 变体,里面是减号和下划线,却按标准表去解。遇到这些,先确认字符串来源和用到的字符集,再让工具自动处理填充,通常就能还原。
参考资料
常见问题
Base64 能用来加密吗?
不能。Base64 只是编码,不含密钥,任何人都能解码还原,起不到保密作用。要保密请用加密工具,要校验完整性请用哈希。
Base64 和 URL 编码有什么区别?
两者目的不同:Base64 把任意二进制数据转成可打印字符,便于在文本环境里搬运;URL 编码则专门处理网址里不能直接出现的字符,把中文、空格、& 等换成 %XX 形式。