【问题标题】:Detecting encoding of uploaded text file (ASP.NET MVC) [duplicate]检测上传文本文件的编码(ASP.NET MVC)[重复]
【发布时间】:2012-12-23 12:20:08
【问题描述】:

可能重复:
How can I detect the encoding/codepage of a text file

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

【问题讨论】:

  • 有没有人知道这个文件的任何部分内容? IE。如果您知道某个特定字符串可能存在,您可以读取它并查看是否可以找到它,如果找不到,请尝试使用不同的编码。
  • @AndrasZoltan 我只知道这些文件是 CSV 文件,要么在 Excel (Windows-1250) 中创建,要么从 Google Docs (UTF) 导出。我不知道这些文件的内容。
  • @mathieu 在这种特定情况下(UTF-8 或 1250)答案不适用
  • 如果您可以使用 BOM,请使用它,否则请参阅 stackoverflow.com/q/90838/266919

标签: c# asp.net-mvc encoding


【解决方案1】:

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

    }

}

【讨论】:

  • 如果我尝试使用您的代码以 UTF 格式读取 win1250 文件,它会引发异常,但下一次尝试以 win1250 格式读取文件的迭代会获得带有 sr.EndOfStream==true 的流,所以什么都没有阅读。我尝试将file.InputStream.Seek(0, SeekOrigin.Begin) 放在try 之后,但没有帮助
  • @IgorKulman 是的,我对细节很不了解,但正如您所见,原理是有效的。也许您可以先将文件读入字节数组,然后在可行的情况下使用字节数组而不是流。
  • @IgorKulman 我猜是using 语句,第一次迭代后流将被关闭
猜你喜欢
  • 2018-07-30
  • 2017-09-25
  • 1970-01-01
  • 2021-12-30
  • 1970-01-01
  • 2013-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多