擅长:python、mysql、java
<p>首先,简单的案例:</p>
<h2>ASCII码</h2>
<p>如果您的数据不包含高于0x7F的字节,那么它是ASCII。(或7位ISO646编码,但这些都是非常过时的。)</p>
<h2>UTF-8型</h2>
<p>如果您的数据验证为UTF-8,那么您可以安全地假设它<em>是</em>UTF-8。由于UTF-8的严格验证规则,误报非常罕见。</p>
<h2>ISO-8859-1与windows-1252</h2>
<p>这两种编码之间的唯一区别是,ISO-8859-1具有C1控制字符,而windows-1252具有可打印字符™š›œžŸ. 我见过很多使用花引号或破折号的文件,但没有一个使用C1控制字符。所以甚至不用麻烦他们,或者ISO-8859-1,只需检测windows-1252。</p>
<p>现在只剩下一个问题了。</p>
<h2>如何区分MacRoman和cp1252?</h2>
<p>这要复杂得多。</p>
<h2>未定义字符</h2>
<p>字节0x81、0x8D、0x8F、0x90、0x9D不在windows-1252中使用。如果它们发生了,那么假设数据是MacRoman。</p>
<h2>相同的字符</h2>
<p>两种编码中的字节0xA2(、、0xA3()、0xA9()、0xB1(±)、0xB5(μ)碰巧相同。如果这些是唯一的非ASCII字节,那么选择MacRoman还是cp1252并不重要。</p>
<h2>统计方法</h2>
<p>计数字符(不是字节!)数据中的频率你知道是UTF-8。确定最常见的字符。然后使用这些数据来确定cp1252或MacRoman字符是否更常见。</p>
<p>例如,在我刚刚对100篇随机英文维基百科文章执行的搜索中,最常见的非ASCII字符是<code>·•–é°®’èö—</code>。基于这个事实</p>
<ul>
<li>字节0x92、0x95、0x96、0x97、0xAE、0xB0、0xB7、0xE8、0xE9或0xF6表示windows-1252。</li>
<li>字节0x8E、0x8F、0x9A、0xA1、0xA5、0xA8、0xD0、0xD1、0xD5或0xE1建议使用MacRoman。</li>
</ul>
<p>把cp1252的建议字节数和MacRoman的建议字节数加起来,取最大值。</p>