如何在.NET中猜测没有BOM的文件的编码?

我在.NET中使用StreamReader类,如下所示:

using( StreamReader reader = new StreamReader( "c:\somefile.html", true ) { string filetext = reader.ReadToEnd(); } 

当文件具有BOM时,这可以正常工作。 我遇到了没有BOM的文件的麻烦..基本上我得到了胡言乱语。 当我指定Encoding.Unicode它工作正常,例如:

 using( StreamReader reader = new StreamReader( "c:\somefile.html", Encoding.Unicode, false ) { string filetext = reader.ReadToEnd(); } 

所以,我需要将文件内容转换为字符串。 那么人们通常如何处理这个呢? 我知道没有解决方案可以在100%的时间内工作,但我想提高我的几率。显然有一些试图猜测的软件(例如,记事本,浏览器等)。 .NET框架中是否有一种方法可以猜测我? 有没有人有他们想分享的代码?

更多背景:这个问题和我的问题差不多,但我在.NET领域。 这个问题让我进入了一个列出各种编码检测库的博客,但没有一个在.NET中

Libary http://www.codeproject.com/KB/recipes/DetectEncoding.aspx

也许是stackoverflow上一个有用的线程

你应该阅读Raymond Chen的这篇文章。 他详细介绍了程序如何猜测编码是什么(以及猜测产生的一些乐趣)

http://blogs.msdn.com/oldnewthing/archive/2004/03/24/95235.aspx

我和Pude是个好运, PudeMozilla Universal Charset DetectorC#端口。

UTF-8的设计方式使得不太可能使用任意8位编码编码的文本,如latin1使用UTF-8解码为正确的unicode。

所以最小的方法就是这个(伪代码,我不说.NET):

尝试:u = some_text.decode(“UTF-8”),但UnicodeDecodeError除外:u = some_text.decode(“most-possible-encoding”)

对于最可能编码的,通常使用例如latin1或cp1252或其他。 更复杂的方法可能会尝试找到特定于语言的字符配对,但我不知道有什么东西可以作为一个库或其他类似的东西。

使用Win32的IsTextUnicode。

从一般意义上说,这是一个艰难的问题。 请参阅: http : //blogs.msdn.com/oldnewthing/archive/2007/04/17/2158334.aspx 。

一种hacky技术可能是采用文本的MD5,然后解码文本并以各种编码重新编码,每个编码MD5。 如果一个匹配,你猜它是那个编码。

对于处理大量文件的东西来说,这显然太慢了,但对于类似文本编辑器的东西,我可以看到它正常工作。

除此之外,从这篇来自Delphi SO问题或使用IE MLangfunction的post中移植java库是非常简单的。

请参阅我的(最近)对此的回答(据我所知,等效)问题: 如何检测文本文件的编码/代码页?

它并不试图猜测像MLang和NCharDet这样的一系列可能的“国家”编码,而是假设你知道你可能会遇到什么样的非unicode文件。 据我所知,它可以非常可靠地解决您的问题(不依赖于MLang的“黑匣子”)。