# Base64 編碼解碼 — 還有 URL、HTML 實體、十六進位和轉義

Base64、百分號編碼、HTML 實體、十六進位和反斜槓轉義，雙向都行。沒有一個字被貼進別人的伺服器。

> 用兩套字母表編碼和解碼 Base64，給 URL 做百分號編碼，轉義 HTML 實體，讀十六進位和反斜槓轉義。全都在你的瀏覽器裡跑，什麼都不上傳——token 從不離開你的機器。

本頁是一個完全在你的瀏覽器裡執行的互動式工具，地址是 https://abox.tools/zh-TW/base64/。你交給它的任何內容都不會被上傳。下面是這個頁面用文字對該工具的全部說明；要使用它，請開啟這個地址。

## 你的文字**不會上傳**。這裡根本沒有伺服器。

這裡的每一種編碼都是對一串字元做算術，就在這個頁面裡做完。編解碼器是手寫的，都在 `src/encode.js` 裡；此外別無他物。這個工具沒有任何形式的網路功能，沒有什麼可取，也沒有什麼可發。這一點幾乎在哪裡都不如在這裡要緊：人們往線上 Base64 解碼器裡貼的是 token，而把 token 貼進別人的網站，等於把它交了出去。

- ✗ 不上傳
- ✗ 不註冊
- ✗ 無大小限制
- ✓ 斷網可用
- ✓ 開源

## 怎樣在不上傳的前提下編碼或解碼 Base64

1. **選好編碼。** 兩套字母表的 Base64、給單個值或整個 URL 用的百分號編碼、五個 HTML 實體、十六進位位元組，以及字串字面量裡的反斜槓轉義。選單下面的說明寫著每一種是做什麼用的。
2. **選好方向。** 「編碼」接收明文，產出編碼後的形式；「解碼」把編碼後的形式還原成明文。結果跟著你的輸入走：換個方向只是一次點選，什麼都不用重敲。
3. **貼進來，或者把檔案拖進來。** 凡是你能選中並複製的都行。拖到選擇框上的檔案由你自己的瀏覽器讀進輸入框：這裡根本沒有可省略的上傳步驟。
4. **有錯誤就讀一讀。** 在這裡失敗的解碼器會說出它遇到了什麼——Base64 不用的字元、填充放錯了地方、不是文字的位元組——而不是返回一個貌似像樣卻錯了的結果。
5. **把結果帶走。** 複製它，或者下載成文字檔案。輸入框下面的計數會告訴你進了多少位元組、出了多少位元組。

## 工具箱裡還有

- [文字與檔案分享](https://abox.tools/zh-TW/share-text/): 分享只活在這個開著的分頁裡。讀的人從你的瀏覽器直接取得加密內容，關掉分頁就結束——任何伺服器上都不留一點東西。
- [QR Code 與條碼產生](https://abox.tools/zh-TW/qr-barcode/): 打進去，就變成一個碼。產生過程不往外送任何東西。
- [QR Code 與條碼識讀](https://abox.tools/zh-TW/qr-barcode-reader/): 把鏡頭對準碼，或者把拍下來的圖丟進來。讀這件事只發生在這裡，別處都沒有。
- [雜湊與校驗和](https://abox.tools/zh-TW/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 根本帶不動的字元。拿前者去編碼整個地址，地址就壞了；拿後者去編碼一個值，就分不清值到哪裡結束。

### 它能處理多大的檔案？

這裡沒有設上限，因為沒有哪臺伺服器在為上限掏錢。真正的天花板是你自己的機器：幾 MB 的文字沒問題；文件特別長的時候，頁面會等你敲字停一下再重新編碼，而不是跟你搶鍵盤。

### 它免費嗎，需要註冊嗎？

免費，沒有帳號，不用登入，沒有試用期，貼多少也沒有上限。本站帶廣告，經費就是從那裡來的，廣告拿不到任何關於你文字的資訊。

### 斷網能用嗎？

能。頁面載入一次之後斷開網路，它照樣運作。這也是證明「什麼都沒上傳」最省事的辦法，真要把你的文字送出去解碼，拔線那一刻就停了。

## 這條隱私承諾怎麼核實

- **你貼進來的東西沒有出去的路。** Content-Security-Policy 裡寫著這個頁面允許聯絡的每一個地址，沒有一個屬於本站。這裡沒有任何可以收走一個貼進來的 token 的接收端，就算有，程式碼裡也沒有把它送過去的東西。
- **這裡不會去取任何東西。** 整個 `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` 那樣返回一個貌似像樣的結果。
