在沒有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