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

时间:2009-03-29 16:41:05

标签: c# .net unicode encoding character-encoding

我正在使用.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框架中是否有一种方法可以猜测我?有没有人有他们想分享的代码?

更多背景:这个question与我的几乎相同,但我在.NET中。这个问题让我进入了一个列出各种encoding detection库的博客,但没有一个在.NET中

8 个答案:

答案 0 :(得分:7)

答案 1 :(得分:3)

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

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

答案 2 :(得分:1)

我很幸运PudeC# Mozilla Universal Charset Detector端口。

答案 3 :(得分:0)

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

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

尝试:    u = some_text.decode(“UTF-8”) 除了UnicodeDecodeError:    u = some_text.decode(“最可能编码”)

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

答案 4 :(得分:0)

我用这个做了类似的事情:

http://www.conceptdevelopment.net/Localization/NCharDet/

答案 5 :(得分:0)

使用Win32的IsTextUnicode。

从一般意义上说,这是一个难题。设置:http://blogs.msdn.com/oldnewthing/archive/2007/04/17/2158334.aspx

答案 6 :(得分:0)

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

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

除此之外,移植来自Delphi SO问题的this post的java库,或使用IE MLang功能,都是动手的。

答案 7 :(得分:0)

请参阅我的(最近)对此的回答(据我所知,相当于)问题:How can I detect the encoding/codepage of a text file

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