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

问题描述 投票:63回答:2

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

我的问题是,我们的文件头包含一个特殊字符“©”,不幸的是,我们的某些源文件是用ANSI编码的。因此,如果我在策略中读取了这些文件,则该字符串看起来像是“ Copyright-2009”。

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

我很累,无法更改字符串的编码,但这无济于事。那么,如何读取这些文件,才能获得正确的字符串“ Copyright©2009”?

c# encoding ansi
2个回答
127
投票

使用Encoding.Default

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

但是,您应该知道,它是使用系统默认编码读取的,该编码可能与文件的编码不同。没有称为ANSI的单一编码,但是通常当人们谈论“ ANSI编码”时,它们的意思是Windows Code Page 1252或他们的盒子碰巧使用的任何东西。

如果您可以找到所使用的exact编码,您的代码将更加健壮。


6
投票

如果您要制定这样的政策,并且还需要团队同意标准编码,这似乎是明智的。老实说,我看不到为什么除了“ Unicode(带签名的UtF-8)-代码页65001”之外的任何团队都使用其他编码(也许除了具有大量非拉丁静态内容的ASPX页外,即使如此我也可以)看不出使用UTF-8有什么大不了的。]

假设您仍想允许混合编码,那么接下来您需要一种方法来确定文件以哪种编码保存,以便您知道将哪种编码传递给ReadAllText。从文件确定这一点并不容易,但是使用Encoding.Default可能可以正常工作。由于它很可能只需要处理两种编码,因此VS(带签名的UTF-8)和您的计算机使用的常见ANSI编码(可能是Windows-1252)。

因此使用

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

将起作用。 (如我所见,乔恩已经发布了)。之所以起作用,是因为在文件的开头出现了UTF-8 BOM(VS用术语“签名”表示)时,所提供的编码参数将被忽略,并且无论如何都将使用UTF-8。因此,在使用UTF-8保存文件的地方,您会得到正确的结果,而在使用ANSI的地方,您也很可能会获得正确的结果。

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

© www.soinside.com 2019 - 2024. All rights reserved.