我正在编写TFS Checkin策略,该策略检查我们的源文件是否包含我们的文件头。

我的问题是,我们的文件标题包含一个特殊字符“©”不幸的是,我们的一些源文件是用ANSI编码的。 因此,如果我在策略中阅读这些文件,字符串将如下所示“Copyright� 2009"

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

我厌倦了改变字符串的编码,但它没有帮助。那么如何阅读这些文件,我得到了正确的字符串“Copyright©2009”?

感谢您的帮助!

关心恩伊

有帮助吗?

解决方案

使用 Encoding.Default

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

但是,您应该知道,它使用系统默认编码来读取它 - 这可能与文件的编码不同。没有一种称为ANSI的编码,但是当人们谈论“ANSI编码”时,通常是。它们意味着Windows代码页1252或其所用的盒子。

如果您能找到所使用的完全编码,您的代码将更加强大。

其他提示

如果你有这样的政策,你也会有团队认可的标准编码,这似乎是明智的。说实话,我不明白为什么任何团队都会使用除“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);

会奏效。 (正如我看到Jon已经发布的那样)。这是有效的,因为当UTF-8 BOM(VS是术语“签名”的含义)出现在文件的开头时,忽略所提供的编码参数,并且无论如何都使用UTF-8。因此,在使用UTF-8保存文件的位置,您可以获得正确的结果,并且在使用ANSI的情况下,您很可能也能获得正确的结果。

顺便说一句,如果您正在处理文件头,那么 ReadAllLines 会使事情变得更容易吗?。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top