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

本文关键字:ASP NET MVC 编码 文件 检测 上载 文本 | 更新日期: 2023-09-27 17:51:15

可能重复:
如何检测文本文件的编码/代码页

我有一个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编码的文件,所以我需要一种方法来检测提交文件的编码。

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

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