0
4

2 回答 2

2

没有完全可靠的方法来识别未知编码。

分布模式可能可以帮助您确定您正在查看的是 8 位还是 16 位编码。双字节编码倾向于对每个其他字节具有略微受限的分布模式。 这就是你现在的位置。

在 16 位编码中,您还可以轻松确定您正在查看的是大端编码还是小端编码。Little-endian 将在偶数字节上具有约束模式,而 big-endian 将在奇数字节上具有约束模式。不幸的是,大多数双字节编码似乎都是大端的,所以这不会有太大帮助。如果您正在查看 little-endian,它可能是 UTF-16LE。

查看您的示例数据,从第一个字节开始,每隔一个字节似乎等于或接近 0xC3(但似乎缺少一些字节,也许?)

个别编码中存在无效的个别字节序列,但总的来说,这不太可能帮助您得出结论。如果您可以使用此策略删除一个或多个候选 16 位编码,那么对您有好处;但这可能不足以解决您的问题。

在这个空间内,您所剩下的只是统计数据。如果文本足够长,您可能会找到重复模式,或者使用频率表为您的候选编码计算每个分数。因为日文书写系统与中文有着共同的遗产,你会发现它们的分布有相似之处,但也有不同之处。从类型上看,日语和汉语有很大的不同,这意味着日语会有助词每隔几个字符,而中文根本没有。所以你会寻找 "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,等等。

从您的样本数据中,您可能在该列表中有项目 139,即U+540D,在 UTF-16be 中为 0x54 0x0D,在 Big-5 中为 0xA5 0x57,在 EUC-JP 中为 0xCC 0xBE,在 GB2312 中为 0xC3 0xFB。(你看到了吗?打!)

于 2015-10-06T11:51:57.843 回答
2

Are there some more restrictions for determining if a file is JIS-X-0208(EUC-JP) encoded

A little, in that the lead bytes 0xF5–0xF8 and 0xFD–0xFE are unassigned, and there are also some other unassigned characters sprinkled at the end of blocks throughout.

That doesn't help you here, though, as the byte sequence C3DCC2EBD3C3BBA7C3FBC3DCC2EBC3FBB3C6C3FBB3C6 is equally valid in GB (密码用户名密码名称名称) and EUC-JP (畜鷹喘薩兆畜鷹兆各兆各).

Such is the joy of charset sniffing. You'll have to prune and reorder the charsets you have based on the likelihood of them existing in your input. Typically in a Windows world EUC-JP is rare (Shift-JIS-alike code page 932 would be used instead) so GB-alike code page 936 would typically ‘win’.

于 2015-10-06T09:18:26.770 回答