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

z8dt9xmd  于 2022-12-05  发布在  其他
关注(0)|答案(4)|浏览(186)

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

u3r8eeie

u3r8eeie1#

您可以测试它可以的假设,但我相信您最终只能知道它肯定不能。换句话说,您可以检查缓冲区,查看是否所有字节序列都是法律的的UTF-8,是否用最少的字节数表示代码点,是否不存在16位代理代码,等等。通过所有这些标准的缓冲区可能看起来是文本,但你可能会上当。
除了Mark Pim在Old New Thing上引用的Raymond Chen的讨论之外,缓冲区实际上可能包含x86机器代码,这些代码恰好被限制在似乎是7位可打印ASCII的子集中。令人惊讶的是,你实际上可以在这个子集中编写有意义的程序,其中一个例子是EICAR防病毒测试病毒。
当然,如果一个缓冲区中包含的字节序列是错误的UTF-8,那么它可能根本就不是UTF-8文本。在这种情况下,你有很高的信心。然后,诀窍就是找出它实际上可能是什么编码。
如果你知道(或者可以假设)缓冲区的语义内容,那么你也可以用它来支持你的判断。例如,如果缓冲区应该包含英语文本,那么它不太可能包含韩语的代码点,而且它通常应该拼写正确,遵循英语语法,等等。当然,这可能会花费很大的测试费用...

efzxgjgh

efzxgjgh2#

不可靠。参见Raymond Chen关于该主题的series
问题是,没有BOM的UTF-8常常与同样有效的ANSI编码难以区分。我认为大多数解决方案(如win32 API IsTextUnicode)使用各种启发式方法来对文本格式给予最佳猜测。

xeufq47z

xeufq47z3#

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

arknldoa

arknldoa4#

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

相关问题