你可以检验它可能的假设,但我相信你最终只能知道它没有确定性.换句话说,您可以检查缓冲区以查看所有字节序列是否合法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
)使用各种启发式方法来对文本格式进行最佳猜测。