Base64 编码与解码
把文字转成 Base64 再转回来,正确处理中文与 emoji 的 UTF-8 编码,也支援网址安全格式。全部在你的浏览器中执行。
在你的浏览器中运行
Base64 是做什么的
Base64 用 64 个字元重新表示任意字节,让数据能通过只接受文字的系统:电子邮件内文、JSON 字串、 网址、HTML 属性。它是编码,不是加密——任何人都能解回原样。千万不要用它来隐藏任何东西。
代价是体积。每 3 个字节会变成 4 个字元,编码后大约会膨胀 33%。
UTF-8 是多数工具出错的地方
浏览器内建的 btoa 只处理 Latin-1 字码单位,遇到 你好 会直接丢出例外,超过 U+00FF 的字元也会
被破坏。正确的做法是先把文字转成 UTF-8 字节:
// 错误:遇到非 Latin-1 字元会丢出例外
btoa('你好')
// 正确
btoa(String.fromCharCode(...new TextEncoder().encode('你好')))
上面的工具两个方向都这样处理,因此中文、日文与 emoji 都能完整还原。如果解码后出现乱码,代表输入 原本就不是 UTF-8 文字——常见的情况是那其实是二进位文件,而不是文字。
标准格式与网址安全格式
两种字母表编码的是同样的字节,只有三个字元不同。
| 第 62 个字元 | 第 63 个字元 | 补位 | |
|---|---|---|---|
| 标准(RFC 4648 §4) | + | / | = |
| 网址安全(RFC 4648 §5) | - | _ | 通常省略 |
在网址查询字串中 + 会被解析成空格,/ 则会切断路径,所以 JWT 与带签章的网址都采用去掉补位的
网址安全格式。上面的解码器两种都接受,有没有补 = 都可以。
Data URI
Data URI 就是在 Base64 前面加上媒体型别,让小图或字型直接嵌在 CSS 或 HTML 里,不必再发一次请求:
data:image/png;base64,iVBORw0KGgo…
只有真正很小的文件才划算——那 33% 的膨胀每次载入页面都要付一次,而且这些字节无法单独快取。
你的数据只留在这里
编码与解码都在你的浏览器完成,贴上的内容不会上传。这一点值得留意:被贴进线上解码器的 Base64 内容,往往就是权杖与工作阶段 Cookie。