首先,简单的情况:
ASCII码
如果您的数据不包含大于0x7F的字节,则为ASCII。(或者是7位ISO646编码,但是已经过时了。)
UTF-8
如果您的数据验证为UTF-8,则可以安全地假定它 为 UTF-8。由于UTF-8严格的验证规则,误报极为罕见。
ISO-8859-1与Windows-1252
这两种编码之间的唯一区别是ISO-8859-1具有C1控制字符,而Windows-1252具有可打印字符€,ƒ„…†‡ˆ‰Š‹ŒŽ“”•-〜™š›
œžŸ。我见过很多使用弯引号或破折号的文件,但是没有使用C1控制字符的文件。因此,甚至不必理会它们或ISO-8859-1,而只需检测Windows-1252。
现在只剩下一个问题了。
您如何区分MacRoman和cp1252?
这要复杂得多。
未定义的字符
Windows-1252中未使用字节0x81、0x8D,0x8F,0x90、0x9D。如果发生这种情况,则假定数据为MacRoman。
相同字符
两种编码中的字节0xA2(¢),0xA3(£),0xA9(©),0xB1(±),0xB5(µ)都相同。如果这些是唯一的非ASCII字节,那么选择MacRoman还是cp1252都没有关系。
统计方法
在您知道为UTF-8的数据中计数字符(不字节!)的频率。确定最频繁的字符。然后使用此数据确定cp1252或MacRoman字符是否更常见。
例如,在我仅对100条随机英语Wikipedia文章执行的搜索中,最常见的非ASCII字符为
·•–é°®’èö—。基于这个事实,
- 字节0x92、0x95、0x96、0x97、0xAE,0xB0、0xB7、0xE8、0xE9或0xF6建议使用Windows-1252。
- 字节0x8E,0x8F,0x9A,0xA1、0xA5、0xA8、0xD0、0xD1、0xD5或0xE1表示MacRoman。
计数cp1252建议字节和MacRoman建议字节,并选择最大的一个。



