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

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

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


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

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

解决方案:

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


当前回答

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

不管怎样,这是你需要读的: 每个软件开发人员绝对、肯定必须知道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.

其他回答

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

如果您正在寻找检测非utf编码(即没有BOM),那么您基本上需要对文本进行启发式和统计分析。您可能想看一看Mozilla关于通用字符集检测的论文(相同的链接,通过Wayback Machine有更好的格式)。

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

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

优点:

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

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

我实际上是在寻找一种通用的,而不是编程的方法来检测文件编码,但我还没有找到。 通过测试不同的编码,我发现我的文本是UTF-7。

我第一次做的是 StreamReader文件= file . opentext (fullfilename);

我不得不把它改成: StreamReader文件=新的StreamReader(fullfilename, System.Text.Encoding.UTF7);

OpenText假设它是UTF-8。

你也可以像这样创建StreamReader new StreamReader(fullfilename, true),第二个参数意味着它应该尝试从文件的byteordermark中检测编码,但这在我的例子中不起作用。

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