2009-08-05 65 views

回答

4

不可靠。关于这个问题,请参阅Raymond Chen的seriesposts

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

+2

使用BOM仍然难以区分。因此,除了积极有害之外,BOM也是无用的。 – 2011-05-24 02:38:10

6

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

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

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

如果你知道(或可以假设)关于缓冲区语义内容的东西,那么你也可以使用它来支持你的决心。例如,如果缓冲区应该包含英文文本,那么不太可能在其中包含来自韩语的代码点,并且通常应该拼写正确,遵循英语语法等等。当然,这可能会花费昂贵的代价...

0

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

0

简单地测试字节序列是否有效为UTF-8。如果是这样,它在任何其他编码中成为有意义的文本的概率基本为零。

相关问题