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 依据、表示方式和预期长度。外观相同不证明字节相等,字节不同也可能是规范化变体。区分字节比较与文字等价,才能选择下一步。

参考资料

使用工具

指南 →