【问题标题】:How to guess the encoding of a file with no BOM in .NET?如何猜测.NET中没有BOM的文件的编码?
【发布时间】:2010-10-16 05:55:15
【问题描述】:

我在 .NET 中使用 StreamReader 类,如下所示:

using( StreamReader reader = new StreamReader( "c:\somefile.html", true ) {
    string filetext = reader.ReadToEnd();
}

当文件有 BOM 时,这可以正常工作。我遇到了一个没有 BOM 的文件的问题 .. 基本上我是胡言乱语。当我指定 Encoding.Unicode 它工作正常,例如:

using( StreamReader reader = new StreamReader( "c:\somefile.html", Encoding.Unicode, false ) {
    string filetext = reader.ReadToEnd();
}

所以,我需要将文件内容转换成一个字符串。那么人们通常如何处理这个问题呢?我知道没有任何解决方案可以 100% 有效,但我想提高我的几率.. 显然有软件试图猜测(例如,记事本、浏览器等)。 .NET 框架中是否有一种方法可以让我猜到?有人有一些他们想分享的代码吗?

更多背景:这个question 和我的差不多,但我在.NET 领域。这个问题让我找到了一个博客,列出了各种 encoding detection 库,但没有一个在 .NET 中

【问题讨论】:

    标签: c# .net unicode encoding character-encoding


    【解决方案1】:

    您应该阅读 Raymond Chen 的这篇文章。他详细介绍了程序如何猜测编码是什么(以及猜测带来的一些乐趣)。

    Some files come up strange in Notepad

    【讨论】:

      【解决方案2】:

      PudeC#Mozilla Universal Charset Detector 端口,我很幸运。

      【讨论】:

        【解决方案3】:

        查看我对这个问题(据我所知,等效)的(最近)回答:How can I detect the encoding/codepage of a text file

        它不会尝试猜测 MLang 和 NCharDet 等一系列可能的“国家”编码,而是假设您知道您可能会遇到哪种非 unicode 文件。据我从您的问题中可以看出,它应该可以非常可靠地解决您的问题(不依赖于 MLang 的“黑匣子”)。

        【讨论】:

          【解决方案4】:

          一种 hacky 技术可能是获取文本的 MD5,然后对文本进行解码并以各种编码重新编码,对每个编码进行 MD5 处理。如果一个匹配,你猜它是那个编码。

          这对于处理大量文件的东西显然太慢了,但对于像文本编辑器这样的东西我可以看到它工作。

          除此之外,从来自 Delphi SO 问题的this post 移植 Java 库或使用 IE MLang 功能将是一件很麻烦的事情。

          【讨论】:

            【解决方案5】:

            使用 Win32 的 IsTextUnicode。

            在一般意义上,这是一个困难的问题。请参阅:http://blogs.msdn.com/oldnewthing/archive/2007/04/17/2158334.aspx

            【讨论】:

              【解决方案6】:

              不久前我用它来做类似的事情:

              http://www.conceptdevelopment.net/Localization/NCharDet/

              【讨论】:

                【解决方案7】:

                【讨论】:

                • 代码项目库看起来不错。它包装了 Microsoft “MLang” api,这可能很糟糕,但它似乎是最好的解决方案
                【解决方案8】:

                UTF-8 的设计方式是,不太可能使用 UTF-8 将文本以任意 8 位编码(如 latin1)解码为正确的 unicode。

                所以最低限度的方法是这样的(伪代码,我不说 .NET):

                尝试: u = some_text.decode("UTF-8") 除了 UnicodeDecodeError: u = some_text.decode("最可能的编码")

                对于最有可能的编码,通常使用例如latin1 或 cp1252 或其他。更复杂的方法可能会尝试并找到特定于语言的字符配对,但我不知道有什么东西可以作为库或类似的东西。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2019-07-14
                  • 1970-01-01
                  • 2013-07-15
                  • 2020-08-14
                  • 2014-11-03
                  • 1970-01-01
                  • 1970-01-01
                  • 2010-09-27
                  相关资源
                  最近更新 更多