如何安全地檢測以.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相同的引用規則,但帶有製表符分隔符。
我不認爲它是重複的,他不想檢測代碼頁,他想檢測文件是否已被正確保存。 – zmbq
@Andre,創建一個excel文件,放入一些非ASCII字符並保存爲MS-DOS CSV文件。什麼變成了非ASCII字符?這些問號是? – zmbq
@zmbq:問題問:「我怎樣才能安全地檢測到一個文件[以.net提交]的文件編碼?」這是一個重複的問題。編碼在Windows中作爲代碼頁實現。無論文件是如何創建的,檢測文件的編碼/代碼頁都不是100%可靠的,如果在文件本身或其元數據中未指定編碼/代碼頁,則必須提示用戶輸入。 –