gpt4 book ai didi

utf-8 - 检测 UTF-8 编码(MS IDE 是怎么做的)?

转载 作者:行者123 更新时间:2023-12-04 14:48:02 24 4
gpt4 key购买 nike

各种字符编码的一个问题是包含的文件并不总是清楚地标记。使用“字节顺序标记”或 BOM 标记某些内容存在不一致的约定。但本质上,您必须被告知文件编码是什么,才能准确读取。

我们构建了读取源文件的编程工具,这让我们感到悲伤。我们有办法指定默认值,并嗅探 BOM 等。我们在约定和默认值方面做得很好。但是我们(我假设其他人)被挂断的地方是未标记 BOM 的 UTF-8 文件。

最近的 MS IDE(例如,VS Studio 2010)显然会“嗅探”一个文件,以确定它是否是没有 BOM 的 UTF-8 编码。 (在工具业务中,我们希望与 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,则您在 0x7F 上看到的第一个字符必须是 UTF-8 序列的开头。所以测试它。这是我们使用的代码:

unc ::IsUTF8(unc *cpt)
{
if (!cpt)
return 0;

if ((*cpt & 0xF8) == 0xF0) { // start of 4-byte sequence
if (((*(cpt + 1) & 0xC0) == 0x80)
&& ((*(cpt + 2) & 0xC0) == 0x80)
&& ((*(cpt + 3) & 0xC0) == 0x80))
return 4;
}
else if ((*cpt & 0xF0) == 0xE0) { // start of 3-byte sequence
if (((*(cpt + 1) & 0xC0) == 0x80)
&& ((*(cpt + 2) & 0xC0) == 0x80))
return 3;
}
else if ((*cpt & 0xE0) == 0xC0) { // start of 2-byte sequence
if ((*(cpt + 1) & 0xC0) == 0x80)
return 2;
}
return 0;
}

如果返回 0,则它不是有效的 UTF-8。否则跳过返回的字符数并继续检查 0x7F 上的下一个字符。

关于utf-8 - 检测 UTF-8 编码(MS IDE 是怎么做的)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11479143/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com