如何在.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是个好运, Pude是Mozilla Universal Charset Detector
的C#
端口。
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的“黑匣子”)。