2013-01-09 28 views
0

可能重複:
How can I detect the encoding/codepage of a text file檢測上傳文本文件的編碼(ASP.NET MVC)

我有一個ASP.NET MVC應用程序。在我看來,我上傳一個文本文件,並與此簽名

[HttpPost] 
public ActionResult FromCSV(HttpPostedFileBase file, string platform) 

我從上傳的文件流爲file.InputStream和使用標準的StreamReader

using (var sr = new StreamReader(file.InputStream)) 
{ 
    ... 
} 

的閱讀控制器方法處理它問題是,這隻適用於UTF文本文件。當我在Windows-1250中有一個文本文件時,字符會混亂。我可以使用Windows-1250編碼的文本文件,在工作的時候明確指定編碼

using (var sr = new StreamReader(file.InputStream, Encoding.GetEncoding(1250))) 
{ 
    ... 
} 

我的問題是,我需要同時支持UTF和Windows-1250編碼的文件,所以我需要一種方法來檢測的編碼提交的文件。

+0

有沒有任何知道這個文件的任何部分的內容?即如果你知道一個特定的字符串可能在那裏,你可以閱讀它,看看它是否可以找到,如果不嘗試使用不同的編碼。 –

+0

@AndrasZoltan我只知道這些文件是CSV文件,既可以在Excel(Windows-1250)中創建,也可以從Google文檔(UTF)導出。我不知道這些文件的內容。 –

+0

@mathieu在這種特定情況下(UTF-8或1250),答案不適用 – Esailija

回答

0

試圖將在Windows-1250中編碼的文件解碼爲UTF-8極有可能導致異常(或者,如果不是,則該文件僅使用ASCII子集,因此使用何種編碼進行解碼無關緊要)與例外後備,所以你可以做這樣的事情:

Encoding[] encodings = new Encoding[]{ 
    Encoding.GetEncoding("UTF-8", new EncoderExceptionFallback(), new DecoderExceptionFallback()), 
    Encoding.GetEncoding(1250, new EncoderExceptionFallback(), new DecoderExceptionFallback()) 
}; 


String result = null; 

foreach(Encoding enc in encodings) { 

    try { 
     result = enc.GetString(fileAsByteArray); 
     break; 
    } 

    catch(DecoderFallbackException e) { 

    } 

} 
+0

如果我嘗試閱讀一個win1250文件作爲UTF使用你的代碼,它會拋出一個異常,但是下一次試圖讀取文件爲win1250的迭代獲得一個'sr.EndOfStream == true'的流,所以沒有什麼可讀的。我嘗試在'try'後放'file.InputStream.Seek(0,SeekOrigin.Begin)',但它沒有幫助 –

+0

@IgorKulman是的,我在細節上很陰暗,但原理正如你所見。也許你可以首先將文件讀到一個字節數組,如果可行的話,使用字節數組而不是流。 – Esailija

+0

@IgorKulman我想這是'using'語句,在第一次迭代之後流將被關閉 – Esailija