检查char *缓冲区是否包含UTF8字符?

时间:2009-08-05 08:36:15

标签: c++ c utf-8

在没有BOM的情况下,有一种快速而又脏的方法可以检查char *缓冲区是否包含UTF8字符?

4 个答案:

答案 0 :(得分:6)

你可以检验它可能的假设,但我相信你最终只能知道它没有确定性。换句话说,您可以检查缓冲区以查看所有字节序列是否合法UTF-8,代码点是否以最少字节数表示,不存在16位代理代码,依此类推。传递所有这些标准的缓冲区似乎是文本,但你可能会被愚弄。

除了由Mark Pim的回答引用的Old New Thing的Raymond Chen讨论之外,缓冲区实际上可能包含x86机器代码,恰好被限制在似乎是7位可打印ASCII的子集中。令人惊讶的是,你实际上可以在该子集中编写有意义的程序,其中一个例子是EICAR反病毒测试病毒。

当然,包含格式错误的UTF-8字节序列的缓冲区可能根本不是UTF-8文本。在这种情况下,你有很高的信心。然后诀窍是找出实际可能的编码。

如果您知道(或可以假设)缓冲区的语义内容,那么您也可以使用它来支持您的决定。例如,如果缓冲区应该包含英文文本,那么它很可能没有来自韩文的代码点,并且通常应该拼写正确,遵循英语语法,等等。当然,测试费用可能很高......

答案 1 :(得分:4)

不可靠。请参阅Raymond Chen关于该主题的series posts

问题是没有BOM的UTF-8常常与同等有效的ANSI编码无法区分。我认为大多数解决方案(如win32 API IsTextUnicode)使用各种启发式方法来对文本格式进行最佳猜测。

答案 2 :(得分:0)

对于快速和肮脏,你不能比this page上的正则表达式做得更好。如果您只是想知道将字节解码为UTF-8是否安全,那就是您所需要的。

答案 3 :(得分:0)

只需测试字节序列是否有效为UTF-8。如果是,那么在任何其他编码中它是有意义的文本的概率基本上为零。