2011-06-23 59 views
1

我有一個網站,用戶可以上傳一個txt文件的數據,數據將被導入到數據庫。但是,有些用戶使用UTF-8上傳數據,而其他用戶則使用UTF-16上傳數據。如何確定上傳的文件是UTF-8還是UTF-16?

byte[] fileData = null; 
    uploader.PostedFile.InputStream.Read(fileData, 0, length); 
    data = TLCommon.EncodeJsString(System.Text.Encoding.UTF8.GetString(fileData)); 

當文件以UTF-16格式保存並上傳時,數據爲垃圾。我該如何處理這種情況?

回答

2

您可以使用各種啓發式方法,例如檢查流中高比例的00字節。 (這些不會以UTF-8出現,但在包含ASCII字符的UTF-16文本中很常見)。

但是,這不能區分UTF-8和Windows-1252,它們是不兼容的位編碼在美國英語Windows系統上都很常見。您可以添加更多的檢查,例如查找在一種編碼中無效但在另一種編碼中無效的字節序列,但是這開始變得非常複雜,並且通常不區分不同的單字節編碼。

Microsoft提供了一個名爲MLang的庫,該庫可以使用流中字節的統計分析自動檢測UTF-8,UTF-16和許多8位代碼頁。如果它有足夠大的文本樣本來處理它,它的準確性相當好。我blogged about how to use this method,並貼出full source code on GitHub

+0

所以更好的選擇是告訴他們只能用utf-8上傳? – Shawn

+0

@Shawn你可以,但我想「僅以UTF-8上傳」對於大多數非技術用戶來說是不可理解的,並且令技術用戶感到沮喪。 –

0

您可以使用幾個選項:檢查content-type是否包含指示編碼的字符集參數(例如Content-Type: text/plain; charset=utf-16);檢查上傳的數據是否有BOM(文件中的前幾個字節,映射到UTF-16的Unicode字符U + FEFF - 2個字節,UTF-8的3個字節),或者如果您知道文件的某些內容(第一個字符應該是ascii,比如在XML中,以'<'開頭),那麼你可以用它來找出編碼。但是如果你沒有這些信息,你必須通過使用一些啓發式來猜測。

+0

字節順序標記是'U + FEFF'(它是UTF16-LE中的'FF FE'或UTF-16BE中的'FE FF')。 'U + FFFE'不是Unicode中的一個字符。 –

+0

謝謝,內聯更正 – carlosfigueira

相關問題