2009-08-05 48 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。如果是這樣,它在任何其他編碼中成爲有意義的文本的概率基本爲零。