UTF-8 是一種可變長度的 Unicode 編碼,會將每個有效的 Unicode 純量值映射為一到四個位元組的序列,並已於 RFC 3629 中標準化。將編碼轉換為 UTF-8,意味著將文字轉成該位元組序列,或反過來執行該程序,並以您可以閱讀、複製或貼上到另一個系統的表示方式呈現。
此 UTF-8 編碼器 / 解碼器 可直接在您的瀏覽器中雙向處理。您可以將 Unicode 文字編碼為十六進位、十進位或 8 位二進位位元組表示法,或是將上述任一種表示法解碼回文字。此轉換器將瀏覽器標準的 TextEncoder 與一個採用嚴格模式的 TextDecoder 搭配使用,因此對於過長的編碼、孤立的接續位元組、代理碼點,以及 U+10FFFF 以上的值等格式錯誤的序列,會明確產生錯誤,而不是靜默地以替代字元 U+FFFD 取代。輸入上限為文字 200,000 個 UTF-16 碼元,以及位元組表示法 200,000 個位元組,且所有處理都不會離開目前的分頁。

UTF-8 如何使用一到四個位元組
UTF-8 將每個 Unicode 純量值表示為一個、兩個、三個或四個位元組,具體取決於其數值範圍。範圍從 U+0000 到 U+007F 的 ASCII 碼點會保留其原始的單位元組值,這就是為什麼 UTF-8 是 ASCII 的嚴格超集合,並且能與大量的舊有資料保持向下相容。U+007F 以上的碼點則使用一個前導位元組宣告後續接續位元組的數量,再加上該數量的接續位元組,每個接續位元組各自攜帶六個有效負載位元。
完整的允許純量範圍從 U+0000 到 U+10FFFF,定義於 Unicode 標準的核心規格 中。UTF-16 代理範圍 U+D800 到 U+DFFF 已被排除:這些碼點沒有直接的 UTF-8 表示方式,任何嘗試編碼它們的動作皆屬無效。位於 U+FFFF 以上的有效輔助字元(例如表情符號),會以從來源中正確配對的代理對所衍生的四位元組序列來編碼。
將 Unicode 文字編碼為 UTF-8 位元組
請依照下列步驟,從任何 Unicode 文字產生精確的 UTF-8 位元組序列。
- 開啟 UTF-8 編碼器 / 解碼器,並選擇 文字轉 UTF-8 位元組 作為方向。
- 選擇與您目的地相符的位元組表示法:十六進位、十進位或 8 位二進位。
- 將您的 Unicode 文字貼上或輸入到輸入區域。此工具最多接受 200,000 個 UTF-16 碼元,包括表情符號、帶有變音符號的字母以及組合記號。
- 點擊轉換按鈕。輸出面板會以您選擇的表示法呈現相同的位元組陣列。
- 將結果面板中回報的位元組計數與您輸入的 Unicode 碼點數進行比對。只要您的文字包含輔助字元,這兩個數字就會不同,因為一個表情符號等於一個碼點,但等於四個 UTF-8 位元組。
舉一個具體的例子來說,以十六進位表示法編碼兩個字元的字串 "A€",會產生四位元組的序列 41 E2 82 AC。第一個位元組 41 是 "A" 的 ASCII 碼。接下來的三個位元組 E2 82 AC 是歐元符號 U+20AC 的 UTF-8 表示方式:一個宣告兩個接續位元組的前導位元組,加上兩個攜帶其餘位元的接續位元組。總長度為 "A" 的一個位元組加上 "€" 的三個位元組,亦即兩個字元共佔四個位元組。
將 UTF-8 位元組解碼回 Unicode 文字
當您已擁有 UTF-8 位元組序列而需要還原成原始字元時,請以相反方向執行轉換。
- 選擇 UTF-8 位元組轉文字 作為方向。
- 選擇與您手頭資料相符的表示法:十六進位、十進位或二進位。
- 使用轉換器所接受的嚴格格式輸入位元組。十六進位輸入可以是一段連續且長度為偶數的字串,也可以是以空格或逗號分隔、每個為一到兩位數的位元組符記,並可選擇性地加上 0x 前綴。十進位輸入僅接受整數符記。二進位輸入則要求每個符記恰好由八個 0 或 1 字元組成。
- 點擊轉換按鈕。若位元組構成有效的 UTF-8 序列,則原始文字會出現;若否,此工具會中止並回報明確的錯誤。
- 在將解碼後的文字貼到任何具有權威性的位置之前,請逐字元確認其與您預期的來源相符。
比較三種輸出表示法
十六進位、十進位與 8 位二進位,是同一底層位元組陣列的三種顯示表示方式。切換表示法絕不會改變編碼後的文字;僅會改變位元組的書寫方式。
| 表示法 | 每個位元組的格式 | 分隔符號 | 最適合用於 |
|---|---|---|---|
| 十六進位 | 兩個大寫數字,例如 E2 | 空格 | 原始碼傾印、除錯記錄、憑證檢查 |
| 十進位 | 0 到 255 的整數,例如 226 | 空格 | 試算表、位元組運算、引述十進位值的通訊協定 |
| 二進位 | 恰好八個 0 或 1 數字,例如 11100010 | 空格 | 講解位元組結構、低階通訊協定研究、位元視覺化 |
若您需要僅使用十六進位的流程,或僅編碼 ASCII 文字,專屬的 文字轉十六進位轉換器 可扮演類似的角色,但通常不會如此嚴格地拒絕未配對的代理,因此當不容許任何資料遺失時,請改用 UTF-8 編碼器 / 解碼器。
為何嚴格解碼很重要
許多解碼器會在遇到無法解讀的位元組時,靜默地將其替換為 Unicode 替代字元 U+FFFD。這種行為對於顯示使用者輸入雖然方便,但卻會掩蓋毀損情形:在一個 100 KB 的承載資料中,一個單獨的雜訊位元組會產生一個替代字元,而下游程式碼將無法得知原始字元究竟是遺失、遭到更改,還是從未存在。
UTF-8 編碼器 / 解碼器反轉了這種行為。它將 TextDecoder 設定為嚴格模式,因此一旦序列過長、遭到截斷、包含孤立的接續位元組、編碼了代理值,或超出 U+10FFFF,轉換便會中止並回報明確的錯誤。結果面板會根據作業類型回報位元組或碼點數,而空輸入會解碼為空文字,而不是替代字元。
編碼時亦採用相同的嚴格標準。此工具會檢查來源字串中是否有未配對的 UTF-16 代理碼元(JavaScript 字串理論上可包含此類碼元),並在呼叫 TextEncoder 之前將其拒絕。若無此檢查,平台編碼器將會以 U+FFFD 取代,而轉換後的輸出將無法再往返還原為原始輸入。
關鍵邊界的 UTF-8 位元組模式
此轉換器會根據 RFC 3629 與 Unicode 標準所制定的固定參考值來驗證其編碼器與解碼器。下表顯示每個字元以十六進位位元組序列呈現的結果。
| 字元 | 碼點 | UTF-8 位元組(十六進位) | 範圍 |
|---|---|---|---|
| $(美元符號) | U+0024 | 24 | 1 位元組 ASCII |
| A(拉丁字母) | U+0041 | 41 | 1 位元組 ASCII |
| ¢(美分符號) | U+00A2 | C2 A2 | 2 位元組,略高於 U+007F |
| €(歐元符號) | U+20AC | E2 82 AC | 3 位元組,略高於 U+0800 |
| 😀(露齒笑臉) | U+1F600 | F0 9F 98 80 | 4 位元組輔助字元 |
| 最大純量值 | U+10FFFF | F4 8F BF BF | 4 位元組上限 |
遭到拒絕的常見格式錯誤輸入
此解碼器刻意會在數種寬鬆工具會靜默接受的模式上失敗。了解哪些輸入會失敗,有助於您診斷從其他系統接收到的位元組串流。
- 過長的編碼,例如 C0 AF,這會以兩個位元組來編碼 U+002F,儘管一個位元組便已足夠。RFC 3629 禁止此類編碼,以防止對同一純量值產生替代解讀。
- 遭到截斷的序列,例如 E2 82,其前導位元組宣告了接續位元組,但接續位元組卻從未出現。
- 孤立的接續位元組,落在 80 到 BF 的範圍內,且未伴隨其應有的前導位元組而出現。
- 代理編碼,即對應到 U+D800 到 U+DFFF 範圍內值的 UTF-8 序列,這些值並非有效的 Unicode 純量。
- 超過 U+10FFFF 的值,包括舊版 UTF-8 草案曾允許,但現行標準已禁止的五位元組與六位元組序列。
限制、隱私與往返驗證
輸入上限為文字 200,000 個 UTF-16 碼元,以及位元組表示法 200,000 個位元組。這些限制約束了記憶體、符記解析、輸出大小以及介面的回應速度,因此此工具無法串流處理數百萬位元組等級的檔案。若需進行批次轉換,請分批執行作業,而非將單一龐大輸入直接餵入轉換器。
所有編碼與解碼作業均於目前瀏覽器分頁中在本機執行。沒有任何資料會被上傳、記錄、儲存、正規化、翻譯、為其他情境進行跳脫處理,或自動複製。這使得此工具適合用於您不希望發送至遠端 API 的承載資料。
在取代任何原始資料之前,請執行一次往返測試:將您的來源文字編碼,把輸出再解碼回來,並逐字元確認解碼後的文字與原始文字相符。若兩者不同,轉換器通常會引發錯誤,而不是產生靜默的替代;請調查出問題的位元組,而不是忽略該訊息。在您於具代表性的樣本上確認完成乾淨的往返之前,請保留原始資料。
若想進一步了解,請參閱 計算 HEX 檔案的 CRC:ISO-HDLC 位元組與步驟。
若想進一步了解,請參閱 Base64 轉十六進位的 API 替代方案:跳過遠端呼叫。