繁体   English   中英

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

[英]Check if a char* buffer contains UTF8 characters?

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

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

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

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

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

不可靠。 请参阅Raymond Chen关于此主题的系列 文章

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM