各种字符编码的问题在于文件并不总是被清晰地标记。有些使用“字节顺序标记”或BOM的标记方式也存在不一致的约定。但本质上,要想准确地读取文件,必须知道文件编码。
我们构建了读取源文件的编程工具,这给我们带来了困扰。我们有手段指定默认值和嗅探BOM等。我们在惯例和默认值方面做得很好。但我们(我认为其他人也是如此)卡在了没有BOM标记的UTF-8文件上。
最近的MS IDE(例如VS Studio 2010)似乎会“嗅探”文件以确定它是否为UTF-8编码且没有BOM。(作为工具业务的从业者,我们希望与MS兼容,因为他们的市场份额,即使这意味着我们必须跟随他们的“愚蠢”)。我特别关注他们使用的启发式方法(尽管讨论启发式方法也可以)。它怎么能“正确”?(考虑这种方式解释的ISO8859-x编码字符串)。
编辑:这篇关于检测字符编码/集合的论文非常有趣: http://www-archive.mozilla.org/projects/intl/UniversalCharsetDetection.html
编辑于2012年12月:我们最终扫描整个文件,以查看是否包含任何UTF-8序列的违规情况......如果没有,我们将其称为UTF-8。这种解决方案的不好之处在于,如果它是UTF-8,您必须处理两次字符。(如果它不是UTF-8,则此测试很快就会确定,除非该文件碰巧全部是7位ASCII,在这种情况下,像UTF-8一样读取不会有问题)。