UTF-8 是一種可變長度的 Unicode 編碼,會將每個有效的 Unicode 純量值映射為一到四個位元組的序列,並已於 RFC 3629 中標準化。將編碼轉換為 UTF-8,意味著將文字轉成該位元組序列,或反過來執行該程序,並以您可以閱讀、複製或貼上到另一個系統的表示方式呈現。

UTF-8 編碼器 / 解碼器 可直接在您的瀏覽器中雙向處理。您可以將 Unicode 文字編碼為十六進位、十進位或 8 位二進位位元組表示法,或是將上述任一種表示法解碼回文字。此轉換器將瀏覽器標準的 TextEncoder 與一個採用嚴格模式的 TextDecoder 搭配使用,因此對於過長的編碼、孤立的接續位元組、代理碼點,以及 U+10FFFF 以上的值等格式錯誤的序列,會明確產生錯誤,而不是靜默地以替代字元 U+FFFD 取代。輸入上限為文字 200,000 個 UTF-16 碼元,以及位元組表示法 200,000 個位元組,且所有處理都不會離開目前的分頁。

convert encoding to utf-8
convert encoding to utf-8

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 位元組序列。

  1. 開啟 UTF-8 編碼器 / 解碼器,並選擇 文字轉 UTF-8 位元組 作為方向。
  2. 選擇與您目的地相符的位元組表示法:十六進位、十進位或 8 位二進位。
  3. 將您的 Unicode 文字貼上或輸入到輸入區域。此工具最多接受 200,000 個 UTF-16 碼元,包括表情符號、帶有變音符號的字母以及組合記號。
  4. 點擊轉換按鈕。輸出面板會以您選擇的表示法呈現相同的位元組陣列。
  5. 將結果面板中回報的位元組計數與您輸入的 Unicode 碼點數進行比對。只要您的文字包含輔助字元,這兩個數字就會不同,因為一個表情符號等於一個碼點,但等於四個 UTF-8 位元組。

舉一個具體的例子來說,以十六進位表示法編碼兩個字元的字串 "A€",會產生四位元組的序列 41 E2 82 AC。第一個位元組 41 是 "A" 的 ASCII 碼。接下來的三個位元組 E2 82 AC 是歐元符號 U+20AC 的 UTF-8 表示方式:一個宣告兩個接續位元組的前導位元組,加上兩個攜帶其餘位元的接續位元組。總長度為 "A" 的一個位元組加上 "€" 的三個位元組,亦即兩個字元共佔四個位元組。

將 UTF-8 位元組解碼回 Unicode 文字

當您已擁有 UTF-8 位元組序列而需要還原成原始字元時,請以相反方向執行轉換。

  1. 選擇 UTF-8 位元組轉文字 作為方向。
  2. 選擇與您手頭資料相符的表示法:十六進位、十進位或二進位。
  3. 使用轉換器所接受的嚴格格式輸入位元組。十六進位輸入可以是一段連續且長度為偶數的字串,也可以是以空格或逗號分隔、每個為一到兩位數的位元組符記,並可選擇性地加上 0x 前綴。十進位輸入僅接受整數符記。二進位輸入則要求每個符記恰好由八個 0 或 1 字元組成。
  4. 點擊轉換按鈕。若位元組構成有效的 UTF-8 序列,則原始文字會出現;若否,此工具會中止並回報明確的錯誤。
  5. 在將解碼後的文字貼到任何具有權威性的位置之前,請逐字元確認其與您預期的來源相符。

比較三種輸出表示法

十六進位、十進位與 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+0024241 位元組 ASCII
A(拉丁字母)U+0041411 位元組 ASCII
¢(美分符號)U+00A2C2 A22 位元組,略高於 U+007F
€(歐元符號)U+20ACE2 82 AC3 位元組,略高於 U+0800
😀(露齒笑臉)U+1F600F0 9F 98 804 位元組輔助字元
最大純量值U+10FFFFF4 8F BF BF4 位元組上限

遭到拒絕的常見格式錯誤輸入

此解碼器刻意會在數種寬鬆工具會靜默接受的模式上失敗。了解哪些輸入會失敗,有助於您診斷從其他系統接收到的位元組串流。

  • 過長的編碼,例如 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 替代方案:跳過遠端呼叫