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

3

如果没有BOM,有没有一种快速而简单的方法来检查一个char*缓冲区是否包含UTF8字符?

4个回答

6
你可以测试假设,但我相信你只能确切地知道它不是。换句话说,你可以检查缓冲区是否所有的字节序列都是合法的UTF-8编码,代码点是否用最少的字节表示,没有16位代理字符等等。通过所有这些标准的缓冲区可能看起来像文本,但你可能会被欺骗。
除了Mark Pim回答中引用的Old New Thing上的Raymond Chen讨论外,缓冲区实际上可能包含x86机器代码,只是恰好限制在似乎是7位可打印ASCII子集中。令人惊讶的是,你实际上可以在该子集中编写有意义的程序,其中一个例子是EICAR防病毒测试病毒。
当然,包含格式错误的UTF-8字节序列的缓冲区可能根本不是UTF-8文本。在这种情况下,你有很高的信心。然后需要的技巧是找出它可能实际上是什么编码。
如果您了解(或可以假设)缓冲区的语义内容,那么您也可以利用它来支持您的确定。例如,如果缓冲区应该包含英文文本,则其中几乎不可能有韩文代码点,并且通常应正确拼写,遵循英语语法等。当然,这样的测试可能会很昂贵...

5

不能保证可靠性。请参考雷蒙德·陈在系列文章中的帖子

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


2
即使有BOM,它仍然是无法区分的。因此,除了对其产生积极的伤害外,BOM是毫无用处的。 - R.. GitHub STOP HELPING ICE

0

只需测试字节序列是否有效的UTF-8格式。如果有效,则它在其他编码中具有意义的概率几乎为零。


0

对于快速而简单的解决方案,你可以使用这个页面上的正则表达式。如果你只想知道是否可以将字节解码为UTF-8,那么这就足够了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接