我有一个包含以下内容的文本文件:
Ã(195) Ü(220) Â(195) ë(235) Ó(211) Ã(195) »(187) §(167) Ã(195) û(251) Ã(195) Ü(220) Â(194) ë(235) Ã(195) û(251) ³(179) Æ(198) Ã(195) û(251) ³(179) Æ(198)
。为简单起见,我在文本中添加了http://www.fileformat.info/得到的Unicode值。按照Unicode字符集,此文件似乎符合https://en.wikipedia.org/wiki/Extended_Unix_Code#EUC-JP中提到的这一行A character from JIS-X-0208 (code set 1) is represented by two bytes, both in the range 0xA1 – 0xFE.
,我的渲染引擎似乎显示日文字符。但是,这实际上是一个包含密码用户名密码名称名称
的中文文本文件,它被Notepad ++识别为GB2312编码文件。是否有更多限制来确定文件是否是JIS-X-0208(EUC-JP)编码,因为它似乎符合Wiki所说的内容?
然而,我的渲染引擎似乎将此文件识别为EUC-JP和中文,但由于EUC-JP的顺序较高,我们认为它是日文和日文字符。
答案 0 :(得分:2)
是否有更多限制来确定文件是否为JIS-X-0208(EUC-JP)编码
一点点,因为前导字节0xF5-0xF8和0xFD-0xFE是未分配的,并且在整个块的末尾还有一些其他未分配的字符。
但是,这对你没有帮助,因为字节序列C3DCC2EBD3C3BBA7C3FBC3DCC2EBC3FBB3C6C3FBB3C6在GB(密码用户名密码名称名称)和EUC-JP(畜鹰喘萨兆畜鹰兆各各)中同样有效。这就是charset嗅闻的快乐。您必须根据输入中存在的字符集修剪和重新排序您拥有的字符集。通常在Windows世界中,EUC-JP很少见(代替使用与Shift-JIS相似的代码页932),因此类似于GB的代码页936通常会“赢”。
答案 1 :(得分:1)
没有完全可靠的方法来识别未知编码。
分布模式可能有助于您确定是在查看8位还是16位编码。对于每个其他字节,双字节编码往往具有略微约束的分布模式。 这就是你现在所处的位置。
在16位编码中,您还可以轻松确定是在查看big-endian还是little-endian编码。 Little-endian将在偶数字节上具有约束模式,而big-endian将在奇数字节上具有约束模式。不幸的是,大多数双字节编码似乎都是大端编码,因此这不会有太大帮助。如果你正在看小端,它很可能是UTF-16LE。
查看您的示例数据,每隔一个字节似乎等于或接近0xC3,从第一个字节开始(但似乎缺少一些字节,也许?)
单个字节序列在单个编码中无效,但总的来说,这不太可能帮助您得出结论。如果你能用这种策略删除一个或多个候选16位编码,那对你有好处;但它可能不足以解决你的问题。
在这个空间内,你剩下的只是统计数据。如果文本足够长,您可能会找到重复的模式,或使用候选编码的频率表来计算每个模式的分数。因为日本的书写系统与中国人有共同的遗产,你会发现他们的分布有相似之处,但也有差异。从字面上看,日语与中文完全不同,这意味着日语每隔几个字符就会particles,而中文则根本没有。{所以你会寻找" no"の," wa"は," ka"か," ga"が," ni"に等等,如果他们在场,就得出结论你正在看日语(或者相反,猜测一下,如果他们缺席,也许你正在看中文;但如果你正在查看名单,例如,它可能仍然是日本)。
在中文(以及日语的切线)中,您可以查看http://www.zein.se/patrick/3000char.html的频率信息;但请记住,日语运行文本中的日语粒子比任何这些标志符号都要常见。
例如,'(列表中的第一项)aka U+7684将是UTF-16be中的0x76 0x84,Big-5中的0xAA 0xBA,EUC-JP中的0xC5 0xAA,GB2312中的0xB5 0xC4等
从您的示例数据中,您可能在该列表上的项目名为U+540D,其中UTF-16be为0x54 0x0D,Big-5为0xA5 0x57,EUC-JP为0xCC 0xBE,0xC3为0xFB GB2312。 (你明白了吗?打!)