2009-09-16 22 views
51

私はTFSチェックインポリシーを作成しています。このポリシーは、ファイルヘッダを含むソースファイルがあるかどうかをチェックしています。特殊文字を含むANSIエンコードファイルを読み取る方法

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

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

文字列のエンコーディングを変更するのは疲れましたが、それは役に立ちません。どうすればこれらのファイルを読むことができますか?正しい文字列 "Copyright©2009"が得られますか?

ありがとうございました!

よろしくENY

+0

まだファイルヘッダーを使用していますか?彼らはほとんど価値がないようです... –

+0

@Mitch:著作権情報をソースコードに入れる代わりに何をお勧めしますか? – AnthonyWJones

+2

これは私たちが決定するものではなく、会社の方針です。 – Enyra

答えて

101

使用Encoding.Default

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

あなたはそれは、システムのデフォルトのエンコード使用してそれを読み込むこと、しかし、注意する必要があります - ファイルのエンコーディングと同じではないかもしれません。 ANSIという単一のエンコーディングはありませんが、は通常です。人々が「ANSIエンコーディング」について言及している場合は、Windowsコードページ1252を意味します。

正確なエンコーディングが使用されていれば、コードはより堅牢になります。

+0

エンコーディングのプリアンブルでエンコーディングタイプを見つけました。その後、うまく動作します。ありがとうございます。 – Enyra

5

あなたがチームに合意した標準的なエンコーディングを持っているようなポリシーを持っているなら、それは賢明なようです。正直言って、「Unicode(署名付きのUtF-8 - Codepage 65001」)以外のエンコーディングを使用する理由はわかりません(おそらく、非ラテン系の静的コンテンツを含むASPXページは例外ですが、どのようにUTF-8を使うのが大変なのかを見てください)。

混在したエンコードを許可すると仮定した場合、次に、ファイルが保存されているエンコードを判別して、どのエンコードをReadAllTextに渡すかを知る方法が必要です。ファイルからこれを判別するのは簡単ではありませんが、Encoding.Defaultを使用しても問題ありません。おそらくあなたは対処する2つのエンコーディングしか持っていないので、VS(署名付きUTF-8)とあなたのマシン(おそらくWindows-1252)で使用されるANSIエンコーディングが共通しています。そのために動作します

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

を使用して

。 (ジョンがすでに掲載しているのを見て)これは、ファイルの先頭にUTF-8 BOM(VSという用語が「シグネチャ」という用語で示す意味)が存在する場合、指定されたエンコーディングパラメータは無視され、UTF-8が使用されるためです。したがって、ファイルがUTF-8を使用して保存される場所では正しい結果が得られ、ANSIが使用されている場所では正しい結果が得られる可能性が最も高いです。

ご存知のように、ファイルヘッダを処理している場合、ReadAllLinesは楽になりませんか?

+0

私はANSIでエンコードされたファイルをいくつか持っているのかも知りません^^ – Enyra

+0

エンコードだけを使ったあなたのソリューションです。入力がUTF8ファイルであってもBOMを持っていないと、デフォルトは失敗します(すべてのUTFファイルがBOMに含まれているとは限りません)。 –

+1

ファイルの先頭にBOMが見つかった場合でも "Encoding.Default"を使用しても、UTF8にフォールバックすることを指摘してくれてありがとう。これは私の日を救った。 – carlos357

関連する問題