【发布时间】:2020-12-10 05:13:41
【问题描述】:
各种字符编码的一个问题是包含文件并不总是被清楚地标记。使用“字节顺序标记”或 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 一样读取不会受到伤害)。
【问题讨论】:
-
尝试以 UTF-8 格式读取整个文件要么是“成功的”,要么是遇到无效的字节序列。在某些时候,我以为我看到了一篇谈论误报可能性的文章,但我无法重新定位它。
-
这个答案 (stackoverflow.com/a/4522251/120163) 声称对于相当短的字符序列有一些微小的“误报”率。我正在尝试确定我是否理解/相信它。
-
... 上面的答案似乎假设从 Unicode 集中抽取的字符是随机的、平坦的分布,我高度怀疑这是错误的,所以我得出结论认为误报率很小的论点是错误的。 (它可能仍然很小)。
-
没有一个 ISO-8859-x 文件中包含一个由 ASCII 包围的非 ASCII 字符将永远是有效的 UTF-8。大多数两字节非 ASCII 序列不是有效的 UTF-8。有一些现实生活中的字符串示例可能会被误解为 UTF-8,但整个文件不太可能只有这些字符串。
-
如果你可以处理整个文件,为什么不检查它的有效 utf-8 编码呢?如果是,很可能是真的 utf-8。
标签: utf-8 character-encoding ide