各种字符编码的一个问题是包含文件并不总是被清楚地标记。使用“字节顺序标记”或 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 一样读取不会受到伤害)。