# Base64 编码解码 — 还有 URL、HTML 实体、十六进制和转义

Base64、百分号编码、HTML 实体、十六进制和反斜杠转义，双向都行。没有一个字被贴进别人的服务器。

> 用两套字母表编码和解码 Base64，给 URL 做百分号编码，转义 HTML 实体，读十六进制和反斜杠转义。全都在你的浏览器里跑，什么都不上传——token 从不离开你的机器。

这是一个浏览器交互工具，地址是 https://abox.tools/zh/base64/。文件在运行该浏览器的设备上处理。主动分享和可选联网功能都在页面上说明。下文是它的文字说明；使用工具请打开该地址。

## 你的文本**在浏览器里处理**，无须上传处理。

这里的每一种编码都是对一串字符做算术，就在这个页面里做完。编解码器是手写的，都在 `src/encode.js` 里；此外别无他物。这个工具没有任何形式的网络功能，没有什么可取，也没有什么可发。这一点几乎在哪儿都不如在这里要紧：人们往在线 Base64 解码器里贴的是 token，而把 token 贴进别人的网站，等于把它交了出去。

- ✗ 不上传
- ✗ 不注册
- ✗ 无大小限制
- ✓ 断网可用
- ✓ 开源

## 怎样在不上传的前提下编码或解码 Base64

1. **选好编码。** 两套字母表的 Base64、给单个值或整个 URL 用的百分号编码、五个 HTML 实体、十六进制字节，以及字符串字面量里的反斜杠转义。菜单下面的说明写着每一种是干什么用的。
2. **选好方向。** “编码”接收明文，产出编码后的形式；“解码”把编码后的形式还原成明文。结果跟着你的输入走：换个方向只是一次点击，什么都不用重敲。
3. **贴进来，或者把文件拖进来。** 凡是你能选中并复制的都行。拖到选择框上的文件由你自己的浏览器读进输入框：这里根本没有可省略的上传步骤。
4. **有错误就读一读。** 在这里失败的解码器会说出它遇到了什么——Base64 不用的字符、填充放错了地方、不是文本的字节——而不是返回一个貌似像样却错了的结果。
5. **把结果带走。** 复制它，或者下载成文本文件。输入框下面的计数会告诉你进了多少字节、出了多少字节。

## 说得更细的版本

[Base64 算加密吗？](https://abox.tools/zh/guides/is-base64-encryption/): 不算。而且这个区别在实际里很要命。编码、加密、哈希解决的是三个不同的问题：第一个谁都能还原，第二个持有密钥的人能还原，第三个谁也还原不了。哪个是哪个，一眼怎么认。

## 工具箱里还有

- [文本与文件分享](https://abox.tools/zh/share-text/): 分享只活在这个打开的标签页里。读的人从你的浏览器直接取走加密内容，关掉标签页就结束——任何服务器上都不留一点东西。
- [二维码与条形码生成](https://abox.tools/zh/qr-barcode/): 打进去，就变成一个码。生成过程不往外送任何东西。
- [二维码与条形码识读](https://abox.tools/zh/qr-barcode-reader/): 把摄像头对准码，或者把拍下来的图丢进来。读这件事只发生在这里，别处都没有。
- [哈希与校验和](https://abox.tools/zh/hash-checksum/): 把下载来的文件和发布方公布的那串数字对一下，不用把它发给任何人。

## 常见问题

### 我的文本会被传到哪里去吗？

不会。这个页面上的每个编码器和解码器，都是在你自己的浏览器里、你自己的硬件上运行的函数。这个工具没有任何形式的网络功能：它从不去取什么，也从不发出什么；页面的 `Content-Security-Policy` 里写着它允许联系的每一个地址，没有一个属于本站。这正是拿它来处理访问令牌或会话 cookie 的理由：把这类东西贴进别人的解码器，等于把它交给了对方。

### 这里的 Base64 和别处的 Base64 一样吗？

一样——它是拿 RFC 4648 的测试向量来核对的，而不是拿自己核对自己。两套字母表都能解码，所以用 `-` 和 `_` 写的 JWT，和用 `+` 和 `/` 写的一样好读；按 64 个字符折行的输入，会替你接回去。编码走的是 UTF-8 字节，所以带重音的字母或者 emoji 一来一回都安然无恙。

### Base64 是加密吗？

不是，把它当加密正是经典的误会。Base64 是一种写法：同样的字节，换一套能在 URL、邮件或 JSON 字符串里活下来的字母表写出来。谁都能把它读回去——这个页面一毫秒就做到了——所以它什么都藏不住，什么都保护不了。你手里的东西要是机密，那它需要的是编码之前的真加密，而不是拿编码来顶替。

### 为什么解码失败了？

因为贴进来的东西和编解码器以为的不完全是一回事，错误信息会说清差在哪儿：Base64 字母表之外的字符、放错位置的填充、后面没跟两位十六进制数的百分号，或者能从 Base64 解出来、却不是 UTF-8 文本的字节——最后这种通常说明原始内容是个文件，不是字符串。换成浏览器自带的 `atob`，它会返回一个貌似像样的结果；而能被告知哪里不对，正是把东西贴进解码器的全部意义。

### 两种网址编码有什么区别？

一个值，还是整个地址。编码“单个值”会转义 URL 赋予了含义的一切——斜杠、问号、和号——这正是查询串里单个参数需要的。编码“整个 URL”则让地址继续能用：斜杠和 `?` 留着，只转义 URL 根本带不动的字符。拿前者去编码整个地址，地址就坏了；拿后者去编码一个值，就分不清值到哪儿结束。

### 它能处理多大的文件？

这里没有设上限，因为没有哪台服务器在为上限掏钱。真正的天花板是你自己的机器：几兆字节的文本没问题；文档特别长的时候，页面会等你敲字停一下再重新编码，而不是跟你抢键盘。

### 它免费吗，需要注册吗？

免费，没有账号，不用登录，没有试用期，贴多少也没有上限。本站带广告，经费就是从那儿来的，广告拿不到任何关于你文本的信息。

### 断网能用吗？

能。页面加载一次之后断开网络，它照样干活。这也是证明“什么都没上传”最省事的办法，真要把你的文本送出去解码，拔线那一刻就停了。

## 这条隐私承诺怎么核实

- **处理在这个浏览器里完成。** 本工具在浏览器里处理输入和结果，处理代码不把它们上传去处理。Content-Security-Policy 限制可用资源和连接目的地，但已允许的主机仍可接收请求。策略不检查载荷，不能单独证明什么都没有发出。请把具体操作的请求与源码核对，或断网完成该本地操作。
- **这里不会去取任何东西。** 整个 `src/` 里没有 `fetch`，没有 `XMLHttpRequest`，也没有 `sendBeacon`。每个编码器和每个解码器，都是这个页面里接收一串字符、返回一串字符的函数。
- **有什么不对，解码器会告诉你。** 浏览器自带的 `atob` 会接受本该拒绝的输入，然后返回一个貌似像样的结果。这里的 Base64 是手写的，用 RFC 4648 的测试向量验证；你贴的不是 Base64 时它会说出来，还会说出原因。`tests/js/text-encode.test.js` 里的测试验证的正是这一点。
- **Google 加载了什么，又拿不到什么。** 广告脚本和统计脚本来自 Google，捐助按钮来自 Buy Me a Coffee。你的文本，一个字符也没有交给它们。读取、解析、写出文本的每一行代码都由这个源提供，也都摆在仓库里。
- **断网也照样能用。** 断开网络，这个工具跟原来一模一样，因为它里面从来就没有联网这一步。这是最省事的一条证明。

**你可以自己核对。**上面这些不用你信。这个页面是仓库里的模板和配置生成出来的，构建脚本你能读，也能自己跑一遍，跑出来的结果就提交在 `dist` 分支上。拿实际发给你的内容，跟你自己从源码构建出来的结果对一遍就知道了： https://github.com/A-Box-of-Tools/website

最值得先读的几个文件：`config/site.toml` 里是 Content-Security-Policy，还有 `src/encode.js`：这里的 Base64 用 RFC 4648 的测试向量来验证，而不是拿自己验自己；坏输入直接拒绝，而不是像 `atob` 那样返回一个貌似像样的结果。
