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

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

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


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

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

解决方案:

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


当前回答

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

其他回答

如果可以链接到C库,则可以使用libenca。见http://cihar.com/software/enca/。从手册页:

Enca读取给定的文本文件,或者在没有给定的情况下读取标准输入, 并使用有关他们语言的知识(必须由您支持)和 它混合了分析、统计分析、猜测和黑魔法 来确定它们的编码。

它是GPL v2。

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

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

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

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

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

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

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

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

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

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

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

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

你不能检测到代码页,你需要被告知。您可以分析字节并猜测它,但这可能会给出一些奇怪(有时很有趣)的结果。我现在找不到它,但我相信记事本可以被骗用中文显示英文文本。

不管怎样,这是你需要读的: 每个软件开发人员绝对、肯定必须知道Unicode和字符集(没有借口!)

乔尔特别说:

The Single Most Important Fact About Encodings If you completely forget everything I just explained, please remember one extremely important fact. It does not make sense to have a string without knowing what encoding it uses. You can no longer stick your head in the sand and pretend that "plain" text is ASCII. There Ain't No Such Thing As Plain Text. If you have a string, in memory, in a file, or in an email message, you have to know what encoding it is in or you cannot interpret it or display it to users correctly.