C# 检测上载文本文件的编码(ASP.NET MVC)

C# 检测上载文本文件的编码(ASP.NET MVC),c#,asp.net-mvc,encoding,C#,Asp.net Mvc,Encoding,可能重复: 我有一个ASP.NETMVC应用程序。在我看来,我上传了一个文本文件,并使用带有此签名的控制器方法对其进行处理 [HttpPost] public ActionResult FromCSV(HttpPostedFileBase file, string platform) 我从上传的文件中获取一个流,作为file.InputStream,并使用标准StreamReader读取它 using (var sr = new StreamReader(file.InputStream))

可能重复:

我有一个ASP.NETMVC应用程序。在我看来,我上传了一个文本文件,并使用带有此签名的控制器方法对其进行处理

[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编码的文件,因此我需要一种方法来检测提交文件的编码。

尝试将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 ) {

    }

}

是否有人知道该文件内容的任何部分?也就是说,如果您知道某个特定字符串可能存在,您可以读取该字符串并查看是否可以找到它,如果不使用其他编码,请尝试使用其他编码。@AndrasZoltan我只知道这些文件是CSV文件,可以在Excel(Windows-1250)中创建,也可以从Google文档(UTF)中导出。我不知道这些文件的内容。@mathieu在这种情况下(UTF-8或1250),答案不适用。如果您可以使用BOM,请使用它,否则请查看如果我尝试使用您的代码将win1250文件读取为UTF,它会引发异常,但是下一次尝试以win1250的形式读取文件的迭代会得到一个
sr.EndOfStream==true
的流,因此没有任何内容可读取。我尝试将
file.InputStream.Seek(0,SeekOrigin.Begin)
放在
try
之后,但没有成功help@IgorKulman是的,我在细节上很模糊,但正如你所看到的,原则是有效的。如果可行的话,您可以先将文件读入字节数组,然后使用字节数组而不是流。@IgorKulman我想这是
using
语句,在第一次迭代后,流将被关闭