【问题标题】:Mystery UTF-8-like encoding神秘的类 UTF-8 编码
【发布时间】:2016-12-23 07:10:17
【问题描述】:

我收到了一个假定 UTF-8 格式的文件,但是对于一些非英语字符有一些奇怪的编码。例如,在这个神秘的编码中,韩文字符串

한국경북영덕군강구면

编码为:

0xED959C 0xEAB5AD 0xEAB2BD 0xEBB63F 0xEC983F 0xEB3F95 0xEAB5B0 0xEAB095 0xEAB5AC 0xEBA9B4

(以粗体表示的差异)而不是标准的 UTF-8:

0xED959C 0xEAB5AD 0xEAB2BD 0xEBB681 0xEC9881 0xEB8D95 0xEAB5B0 0xEAB095 0xEAB5AC 0xEBA9B4"

我在西里尔文和中文字符上看到了相同的现象——有些字符的编码与 UTF-8 相同,但有些不同。乱码字符与非乱码字符具有相同的字节宽度,并且我已经验证它们不是扩展集的一部分。另外,我已经验证了这是 not Java“Modified UTF-8”。

关于这可能是什么的任何其他想法?

顺便说一句:我无权访问代码或最初编写该文件的人。

另外,我使用的是 Mac 10.11.6,以防万一。

【问题讨论】:

    标签: utf-8


    【解决方案1】:

    您的示例字符串由 UTF-8 组成,但将某些字节值(即 x81 和 x8D)替换为 ASCII 问号 ? (x3F)。唯一合理的解释是,您的示例字符串通过了一个软件,该软件试图根据其他编码(可能是单字节字符集)解释其内容,并且用? 替换了“无效”字符(类似地Unicode 文本处理器如何用 U+FFFD 替换无效的 Unicode 字符)。

    不幸的是,该过程并不是真正可逆的,因为至少有两个不同的字节值(可能还有更多不会出现在您的示例中)被替换,因此无法保证在每个字节中识别原始字节值案子。根据它的重要性——也就是说,取决于它值得花多少时间——你可能会识别出被替换的完整字节集,然后编写一些东西来尝试每个字节的每个可能值,比较结果字符- 来自相关语言的某些文本语料库的(比如说)双组词频率的序列,并选择最可能的字节。 (当然,它会犯一些错误。要估计由此产生的错误率,您可以在已知文本上尝试相同的过程。)

    【讨论】: