web-dev-qa-db-ja.com

特殊文字を含むANSIエンコードファイルを読み取る方法

ソースファイルにファイルヘッダーが含まれているかどうかをチェックするTFSチェックインポリシーを作成しています。

私の問題は、ファイルヘッダーに特殊文字「©」が含まれていることです。残念ながら、ソースファイルの一部はANSIでエンコードされています。したがって、ポリシーでこれらのファイルを読み取ると、文字列は「Copyright�2009」のようになります。

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

文字列のエンコードを変更するのはうんざりしましたが、役に立ちません。正しい文字列「Copyright©2009」を取得するには、これらのファイルをどのように読み取ることができますか?

手伝ってくれてありがとう!

よろしくEny

57
Enyra

つかいます Encoding.Default

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

ただし、システムのデフォルトのエンコーディングを使用してそれを読み取ることに注意してください-ファイルのエンコーディングとは異なる場合があります。 ANSIと呼ばれる単一のエンコーディングはありませんが、通常「ANSIエンコーディング」について話すとき、それはWindowsコードページ1252またはそのボックスが使用するものを意味します。

exactエンコーディングが使用されていることがわかると、コードはより堅牢になります。

120
Jon Skeet

チームが標準のエンコーディングに同意するようなポリシーを設定する場合は、賢明と思われます。正直なところ、チームが「Unicode(UtF-8 with signature)-Codepage 65001」以外のエンコーディングを使用する理由がわかりません(ただし、ラテン以外の重要な静的コンテンツを含むASPXページを除きますが、それでも可能です) t UTF-8を使用するのが大したことではないか確認してください)。

まだ混合エンコーディングを許可する場合、ファイルがどのエンコーディングに保存されているかを判断する方法が必要になるため、ReadAllTextに渡すエンコーディングを知ることができます。ファイルからこれを決定するのは簡単ではありませんが、Encoding.Defaultは大丈夫です。ほとんどの場合、VS(署名付きUTF-8)と、マシン(おそらくWindows-1252)で使用されている一般的なANSIエンコーディングの2つのエンコーディングしか処理できません。

したがって、使用

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

働くでしょう。 (私が見るように、ジョンはすでに投稿しています)。これは、ファイルの先頭にUTF-8 BOM(VSが「署名」という用語で意味するもの)が存在する場合、指定されたエンコードパラメーターが無視され、UTF-8が使用されるためです。したがって、UTF-8を使用してファイルを保存すると、正しい結果が得られ、ANSIを使用すると、正しい結果が得られる可能性が高くなります。

ところで、ファイルヘッダーを処理している場合、ReadAllLinesで物事が簡単になることはないでしょうか。

5
AnthonyWJones