【发布时间】:2010-11-16 22:38:13
【问题描述】:
在没有 BOM 的情况下,是否有一种快速而肮脏的方法可以检查 char* 缓冲区是否包含 UTF8 字符?
【问题讨论】:
在没有 BOM 的情况下,是否有一种快速而肮脏的方法可以检查 char* 缓冲区是否包含 UTF8 字符?
【问题讨论】:
不可靠。有关该主题,请参阅 Raymond Chen 的 series 或 posts。
问题在于,没有 BOM 的 UTF-8 通常与同样有效的 ANSI 编码无法区分。我认为大多数解决方案(如 win32 API IsTextUnicode)使用各种启发式方法来对文本格式进行最佳猜测。
【讨论】:
您可以测试它可以测试的假设,但我相信您最终只能确定它不能确定。换句话说,您可以检查缓冲区以查看是否所有字节序列都是合法的 UTF-8、代码点是否用最少的字节数表示、是否不存在 16 位代理代码等等。通过所有这些标准的缓冲区可能看起来是文本,但您可能会被愚弄。
除了 Mark Pim 的回答引用的旧新事物中 Raymond Chen 的讨论之外,缓冲区实际上可能包含 x86 机器代码,而这些代码恰好被限制为似乎是 7 位可打印 ASCII 的子集。令人惊讶的是,您实际上可以在该子集中编写有意义的程序,其中一个例子是 EICAR 防病毒测试病毒。
当然,包含格式错误的 UTF-8 字节序列的缓冲区可能根本就不是 UTF-8 文本。在这种情况下,你有很高的信心。然后诀窍是弄清楚它实际上可能是什么编码。
如果您知道(或可以假设)缓冲区的语义内容,那么您也可以使用它来支持您的决定。例如,如果缓冲区应该包含英文文本,那么其中极不可能有来自韩语的代码点,并且通常应该拼写正确,遵循英文语法等等。当然,这可能会使测试变得昂贵......
【讨论】:
为了快速和肮脏,你不能比this page 上的正则表达式做得更好。如果您只想知道将字节解码为 UTF-8 是否安全,这就是您所需要的。
【讨论】:
只需测试字节序列作为 UTF-8 是否有效。如果是,它在任何其他编码中成为有意义文本的概率基本上为零。
【讨论】: