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

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

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


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

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

解决方案:

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


当前回答

我在Python中做过类似的事情。基本上,您需要来自各种编码的大量示例数据,这些数据由一个滑动的两字节窗口分解并存储在字典(散列)中,以提供编码列表值的字节对为键值。

给定这个字典(哈希),你把你的输入文本:

如果它以任何BOM字符开头('\xfe\xff'用于UTF-16-BE, '\xff\xfe'用于UTF-16-LE, '\xef\xbb\xbf'用于UTF-8等),我将其视为建议 如果不是,那么取足够大的文本样本,取样本的所有字节对,并选择从字典中建议的最不常见的编码。

如果您还采样了不以任何BOM开头的UTF编码文本,那么第二步将涵盖从第一步中遗漏的文本。

到目前为止,它对我来说是有效的(示例数据和后续输入数据是各种语言的字幕),错误率正在降低。

其他回答

遇到了同样的问题,但还没有找到一个自动检测的好解决方案。 现在我使用PsPad (www.pspad.com)为那;)工作正常

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

我知道现在提这个问题已经很晚了,而且这个解决方案不会吸引一些人(因为它以英语为中心的偏见和缺乏统计/实证测试),但它对我来说非常有效,特别是在处理上传的CSV数据方面:

http://www.architectshack.com/TextFileEncodingDetector.ashx

优点:

内置BOM检测 默认/回退编码可定制 相当可靠(以我的经验)的西欧文件包含一些奇异的数据(如法国名称)与混合UTF-8和拉丁-1风格的文件-基本上大部分美国和西欧环境。

注意:我是编写这个类的人,所以显然要持保留态度!:)

由于它基本上归结为启发式,因此使用以前从同一来源收到的文件的编码作为第一个提示可能会有所帮助。

大多数人(或应用程序)每次都以几乎相同的顺序做事,通常是在同一台机器上,所以当Bob创建一个.csv文件并将其发送给Mary时,它很可能总是使用Windows-1252或他的机器默认的任何文件。

在可能的情况下,一点客户培训也不会有什么坏处:-)

我使用这段代码来检测Unicode和windows默认的ansi代码页时读取文件。对于其他编码,需要手动或通过编程检查内容。这可以用来保存与打开时相同编码的文本。(我使用VB.NET)

'Works for Default and unicode (auto detect)
Dim mystreamreader As New StreamReader(LocalFileName, Encoding.Default) 
MyEditTextBox.Text = mystreamreader.ReadToEnd()
Debug.Print(mystreamreader.CurrentEncoding.CodePage) 'Autodetected encoding
mystreamreader.Close()