2013-12-16 66 views
0

我的asp.net應用程序中有一個輸入文件。 用戶提交CSV文件以更新數據庫。檢測文件是否是ISO-8859-1/Unicode(或不是ASCII)

此CSV文件是通過導出.xlsx創建的。
此.xlsx文件包含非ascii字符,如França,Rússia等
用戶有時通過「CSV(MS-DOS)」(寫入ASCII格式)而不是「CSV(逗號分隔文件)「(保留.xlsx編碼)。

所以,驗證文件的編碼之前寫它在數據庫中的內容....

我怎樣才能安全地檢測在.NET中提交了一份文件,文件編碼?

ps .:物料清單驗證是不夠的。文件可以是帶有BOM的UTF文件。

+0

我不認爲它是重複的,他不想檢測代碼頁,他想檢測文件是否已被正確保存。 – zmbq

+0

@Andre,創建一個excel文件,放入一些非ASCII字符並保存爲MS-DOS CSV文件。什麼變成了非ASCII字符?這些問號是? – zmbq

+0

@zmbq:問題問:「我怎樣才能安全地檢測到一個文件[以.net提交]的文件編碼?」這是一個重複的問題。編碼在Windows中作爲代碼頁實現。無論文件是如何創建的,檢測文件的編碼/代碼頁都不是100%可靠的,如果在文件本身或其元數據中未指定編碼/代碼頁,則必須提示用戶輸入。 –

回答

3

如何安全地檢測以.net提交的文件的文件編碼?

你不行。

Excel的「CSV」保存出現在機器的ANSI代碼頁中,「CSV(MS-DOS)」出現在OEM代碼頁中。這兩種編碼都因機器而異,它們從來沒有像UTF-8或UTF-16那樣有用。 (事實上​​,在一些東亞機器上,它們甚至可能不完全是ASCII兼容的。)

您可能能夠根據啓發式進行猜測。例如,如果França是在文檔中你處理,你可以發現它的常用編碼一個共同的價值:

            F r a n ç a 
Code page 1252 (ANSI on Western European machines): 46 72 61 6e e7 61 
Code page 850 (OEM on Western European Machines): 46 72 61 6e 87 61 

如果你沒有任何固定模式,比如,你可以做的最好的是任意的猜測(見this question )。無論哪種方式,它幾乎沒有資格作爲'安全'。

作爲一種格式的CSV沒有聲明編碼的機制,並且沒有使用UTF-8的事實標準。所以它不能真正用作傳輸非ASCII文本的可靠程度的機制。

另一種可供選擇的方法是鼓勵用戶將其從Excel保存爲「Unicode文本」。這會爲您提供一個UTF-16LE編碼的.txt文件(用.NET術語說就是Encoding.Unicode),您可以從BOM中輕鬆檢測到該文件。內容是TSV,所以與CSV相同的引用規則,但帶有製表符分隔符。