在我们的应用程序中,我们从不同的来源接收文本文件(.txt, .csv等)。读取时,这些文件有时包含垃圾,因为这些文件是在不同的/未知的代码页中创建的。

是否有一种方法(自动)检测文本文件的代码页?

detectEncodingFromByteOrderMarks,在StreamReader构造函数上,适用于UTF8和其他unicode标记的文件,但我正在寻找一种方法来检测代码页,如ibm850, windows1252。


谢谢你的回答,这就是我所做的。

我们收到的文件来自最终用户,他们没有关于代码页的线索。接收者也是最终用户,到目前为止,这是他们对代码页的了解:代码页存在,并且令人讨厌。

解决方案:

在记事本中打开收到的文件,查看一段乱码的文本。如果有人叫François之类的,凭你的智商你就能猜出来。 我已经创建了一个小应用程序,用户可以使用它打开文件,并输入用户知道它将出现在文件中的文本,当使用正确的代码页时。 遍历所有代码页,并显示包含用户提供的文本的解决方案的代码页。 如果多个代码页同时弹出,请用户指定更多文本。


当前回答

如果有人在寻找一个93.9%的解决方案。这对我来说很管用:

public static class StreamExtension
{
    /// <summary>
    /// Convert the content to a string.
    /// </summary>
    /// <param name="stream">The stream.</param>
    /// <returns></returns>
    public static string ReadAsString(this Stream stream)
    {
        var startPosition = stream.Position;
        try
        {
            // 1. Check for a BOM
            // 2. or try with UTF-8. The most (86.3%) used encoding. Visit: http://w3techs.com/technologies/overview/character_encoding/all/
            var streamReader = new StreamReader(stream, new UTF8Encoding(encoderShouldEmitUTF8Identifier: false, throwOnInvalidBytes: true), detectEncodingFromByteOrderMarks: true);
            return streamReader.ReadToEnd();
        }
        catch (DecoderFallbackException ex)
        {
            stream.Position = startPosition;

            // 3. The second most (6.7%) used encoding is ISO-8859-1. So use Windows-1252 (0.9%, also know as ANSI), which is a superset of ISO-8859-1.
            var streamReader = new StreamReader(stream, Encoding.GetEncoding(1252));
            return streamReader.ReadToEnd();
        }
    }
}

其他回答

notepad++具有这个功能。它还支持对其进行更改。

在AkelPad中打开文件(或只是复制/粘贴乱码文本),点击编辑->选择->重新编码…->检查“自动检测”。

10年(!)已经过去了,我仍然没有看到MS的好的、非gpl的解决方案:IMultiLanguage2 API。

前面提到的大多数库都是基于Mozilla的UDE的——浏览器已经解决了类似的问题,这似乎是合理的。我不知道chrome的解决方案是什么,但自从IE 5.0 MS发布了他们的解决方案,它是:

没有gpl之类的许可问题, 可能是永远的支持和维护 给出丰富的输出-所有编码/编码页的有效候选以及置信度分数, 非常容易使用(它是一个单一的函数调用)。

它是一个原生COM调用,但这里有Carsten Zeumer的一些非常好的工作,它处理了。net使用中的互操作混乱。周围还有一些其他的图书馆,但总的来说,这个图书馆没有得到应有的关注。

您无法检测到代码页

这显然是错误的。每个web浏览器都有某种通用字符集检测器来处理没有任何编码指示的页面。Firefox就有一个。您可以下载代码并查看它是如何执行的。请在这里查看一些文档。基本上,这是一种启发式,但效果非常好。

给定合理数量的文本,甚至可以检测语言。

这是我刚刚用谷歌发现的另一个:

StreamReader类的构造函数接受一个“detect encoding”参数。