如何读取包含特殊字符的ANSI编码文件

我正在写一个TFS签入策略,它检查我们的源文件是否包含我们的文件头。

我的问题是,我们的文件头包含一个特殊的字符“©”,不幸的是我们的一些源文件在ANSI编码。 所以如果我在策略中读取这些文件,这个string看起来就像这个“Copyright?2009”。

string content = File.ReadAllText(pendingChange.LocalItem); 

我厌倦了改变string的编码,但它没有帮助。 那我该如何读取这些文件,才能得到正确的string“Copyright©2009”?

感谢帮助!

问候恩

使用Encoding.Default

 string content = File.ReadAllText(pendingChange.LocalItem, Encoding.Default); 

但是,您应该知道,它使用系统默认编码读取它 – 这可能与文件的编码不同。 没有单一的编码称为ANSI,但是通常当人们谈论“ANSI编码”时,他们指的是他们使用的盒子。

如果您能够find所使用的确切编码,您的代码将更加健壮。

如果你有这样的政策,你也会有团队认可的标准编码,这似乎是明智的。 说实话,我不明白为什么任何一个团队会使用除“Unicode(UtF-8 with signature) – Codepage 65001”以外的编码(除了ASPX页面可能包含非拉丁静态内容,但即使如此,看看如何使用UTF-8将是一个大问题)。

假设您仍然希望允许混合编码,那么接下来需要一种方法来确定文件保存在哪个编码中,以便知道将哪个编码传递给ReadAllText 。 它不容易从文件中确定,但使用Encoding.Default可能会正常工作。 由于它最有可能只有2个编码来处理VS(UTF-8带签名)和一个通用的ANSI编码(可能是Windows-1252)。

因此使用

  string content = File.ReadAllText(pendingChange.LocalItem, Encoding.Default); 

将工作。 (正如我看到乔恩已经发布)。 这是有效的,因为当UTF-8 BOM(这是VS表示“签名”的意思)出现在文件的开头时,提供的编码参数将被忽略,而UTF-8仍然被使用。 因此,在使用UTF-8保存文件的情况下,您将得到正确的结果,而在使用ANSI的情况下,您最有可能得到正确的结果。

顺便说一句,如果你正在处理文件标题不会ReadAllLines使事情更容易?