SheepDev

編碼與字元集

這串十六進位位元組是哪些 UTF-8 字元?

使用工具

日誌顯示 e3 81 82 而非文字。知道是十六進位仍不能判斷三位元組是一字還是多字,解碼需要字元編碼。文字/位元組工具使用 UTF-8,可從已知短文字建立對應。

把「あ」編碼成三位元組

第一個文字輸入
あ

編碼輸出 e38182(分組寫作 e3 81 82)、二進位 11100011 10000001 10000010,長度 3 位元組。它們是同一資料的不同表示,每兩位十六進位或八位二進位為一位元組,顯示空白不是原字元內的空白。

切換解碼並選十六進位,只貼 hex 位元組,不要連結果 JSON 或欄位名一起貼,應還原 あ。二進位模式需對應八位組,切換選項不會自動轉換輸入表示。

逐一加入英文、日文與表情

用於比較長度的文字
Aあ😀

A 為 41 一位元組,あ 三位元組,😀 為 f0 9f 98 80 四位元組,共八位元組。逐字刪除觀察變化,再用字元計數比較可見字元、碼位、UTF-16 單元與 UTF-8 位元組。

八位元組寫成十六進位需十六字元,但原資料並未變成十六位元組。若把十六進位表記存為文字,則該表示另有容量。應區分負載位元組與診斷字串長度。

截斷位元組可能無法還原字元

截斷的 UTF-8
e3 81

刪掉末尾 82 後 UTF-8 不完整,解碼失敗。隨意補位元組消除錯誤不等於恢復原文。若日誌或傳輸截斷,應回到保有原資料的來源;拒絕靜默替換有助發現損壞。

十六進位奇數位或含 g 等非法字元,首先就不是有效位元組表示。先檢查表記,再檢查 UTF-8,才能區分抄錯、截斷與編碼不符。

讀不出來不代表加密

此處按 UTF-8 解碼,不會識別恢復壓縮資料、圖片、密文或任意編碼。已知來源編碼時使用字元編碼轉換;多次猜測碰巧出現可讀文字不證明編碼正確。

U+3042 是碼位,不是 UTF-8 位元組 e3 81 82。把 3042 當十六進位位元組輸入並不表示 あ。先確認日誌欄位記錄的是字元編號還是編碼位元組。

不可見換行也占位元組

A 是 41,後接 LF 為 41 0a,CRLF 為 41 0d 0a。外觀相近,雜湊或簽章輸入卻不同。先看末尾位元組再決定刪換行,否則會遺失差異證據。

記錄原文、UTF-8 依據、表示方式與預期長度。外觀相同不證明位元組相等,位元組不同也可能是正規化變體。區分位元組比較與文字等價,才能選擇下一步。

參考資料

使用工具

指南 →