我收到了一个据说在UTF-8中的文件,但是对于一些非英语字符有一些奇怪的编码。例如,在这个神秘的编码中,Hangul字符串
한국경북영덕군강구면
编码为:
0xED959C 0xEAB5AD 0xEAB2BD 0xEBB63F 0xEC983F 0xEB3F95 0xEAB095 0xEAB095 0xEAB5AC 0xEBA9B4
(粗体差异)而不是标准UTF-8:
0xED959C 0xEAB5AD 0xEAB2BD 0xEBB 681 0xEC9881 0xEB8D95 0xEAB095 0xEAB095 0xEAB5AC 0xEBA9B4“
我看到了西里尔字母和汉字的相同现象--有些字符和UTF-8有相同的编码,但有些则不同。乱码字符与非乱码字符的字节宽度相同,我已经证实它们不是扩展集的一部分。另外,我已经证实这是而不是 Java“修改后的UTF-8”。
对于这可能是什么,还有什么其他的想法吗?
顺便说一句:我无法访问代码或最初编写文件的人。
另外,我在Mac10.11.6上,以防与此有任何关系。
发布于 2016-12-22 23:10:17
示例字符串由UTF-8组成,但某些字节值(即x81和x8D)替换为ASCII问号? (x3F)。唯一合理的解释是,您的示例字符串已通过一段软件,该软件试图根据其他编码(可能是单字节字符集)解释其内容,并将“无效”字符替换为? (类似于Unicode文本处理器如何用U+FFFD替换无效Unicode字符)。
不幸的是,这个过程并不是完全可逆的,因为至少有两个不同的字节值(可能还有更多的字节值在您的示例中没有出现)被替换了,因此在每种情况下都没有确定原始字节值的保证方法。这取决于它有多重要--也就是说,取决于它花在上面的时间--你可以潜在地识别被替换的完整字节集,然后写一些东西,为每个字节尝试每一个可能的值,将得到的字符序列与(例如)相关语言文本语料库中的二进制图频率进行比较,并选择最可能的字节。(当然,它会犯一些错误。若要估计结果错误率,可以在已知文本上尝试相同的进程。)
https://stackoverflow.com/questions/41288511
复制相似问题