在没有BOM的情况下,我有一种快速和肮脏的方法可以检查char *缓冲区是否包含UTF8字符?检查char *缓冲区是否包含UTF8字符?
2
A
回答
4
不可靠。关于这个问题,请参阅Raymond Chen的series的posts。
问题在于没有BOM的UTF-8通常无法与同等有效的ANSI编码区分开来。我认为大多数解决方案(如win32 API IsTextUnicode
)都使用各种启发式方法来对文本格式进行最佳猜测。
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。如果是这样,它在任何其他编码中成为有意义的文本的概率基本为零。
相关问题
- 1. 检查当前的Emacs缓冲区是否包含字符串
- 2. 如何检查stdin缓冲区是否包含一些数据?
- 3. 如何NSLog缓冲区流中包含零的字节缓冲区(NSData/const char *)?
- 4. 如何检查一个字符串是否包含char?
- 5. makefile是否可以包含UTF8字符?
- 6. 检查stdin缓冲区是否为空
- 7. 修剪UTF8缓冲区
- 8. 检查字符串是否包含除
- 9. 检查是否字符串包含“HTTP://”
- 10. 检查Enum是否包含字符串?
- 11. 检查NSMutableArray是否包含字符串
- 12. 检查NSFont是否包含字符
- 13. 检查MySQL列是否包含字符
- 14. 检查行是否包含字符串
- 15. 检查是否WCHAR包含字符串
- 16. 检查数组是否包含字符
- 17. 检查std :: stringstream是否包含字符 - 缓存直到\ n
- 18. 检查char *类型的字符串是否包含另一个字符串
- 19. 包含输出缓冲区?
- 20. 检查字符串是否包含字(不是子字符串!)
- 21. 包装纸字符串缓冲区
- 22. 字符缓冲区比较
- 23. 我如何转换的char *缓冲区为unsigned char缓冲区
- 24. 检查字符串是否包含字符集中的字符
- 25. 生成*字符缓冲区
- 26. c# - 检查字符串是否包含字符和数字
- 27. 检查字符串中是否包含字符和数字
- 28. 字节缓冲区,字符缓冲区,字符串和字符集
- 29. 检测一个字节缓冲区包含int或只是一个字节[]
- 30. PHP检查字符串是否包含数字和检查字符串长度
使用BOM仍然难以区分。因此,除了积极有害之外,BOM也是无用的。 – 2011-05-24 02:38:10