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

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

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


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

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

解决方案:

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


当前回答

“uchardet”工具使用每个字符集的字符频率分布模型很好地做到了这一点。更大的文件和更“典型”的文件具有更强的可信度(显然)。

在ubuntu上,你只需要apt-get install uchardet。

在其他系统上,从这里获取源代码、用法和文档:https://github.com/BYVoid/uchardet

其他回答

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

感谢@Erik Aronesty提到uchardet。 与此同时,linux也有一个工具:chardet。 或者,在cygwin上,你可能想使用:chardetect。

参见:chardet手册页:https://www.commandlinux.com/man-page/man1/chardetect.1.html

这将启发式地检测(猜测)每个给定文件的字符编码,并报告每个文件检测到的字符编码的名称和置信级别。

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

你有没有尝试过c#移植到Mozilla通用字符集检测器

例子来自http://code.google.com/p/ude/

public static void Main(String[] args)
{
    string filename = args[0];
    using (FileStream fs = File.OpenRead(filename)) {
        Ude.CharsetDetector cdet = new Ude.CharsetDetector();
        cdet.Feed(fs);
        cdet.DataEnd();
        if (cdet.Charset != null) {
            Console.WriteLine("Charset: {0}, confidence: {1}", 
                 cdet.Charset, cdet.Confidence);
        } else {
            Console.WriteLine("Detection failed.");
        }
    }
}    

您无法检测到代码页

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

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

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