C#でGitのDiffコマンドを起動して受け取った結果を処理しとうと思い、ずっと後回しにしてた文字化け問題がやっと解決しました。
C#ではProcessクラスで外部コマンドを実行し、標準出力から結果を受け取ります。ここで受け取るときに文字化けを起こしていました。文字列を受け取った後に、文字列をエンコードしても、微妙に文字化けがのこってしまいうまくいきませんでした。
原因
Processクラスで結果を受け取るには、StandartOutputプロパティを参照しますが、StandartOutputはReadStreamオブジェクトであり、Net Fremeworkでは既定のエンコードであるShift-JISとなります。一方Git Diffの出力はUTF-8なので、Shift-JISでUTF-8を読みに行くので文字化けとなってしまいました。
解決法
ProcessオブジェクトにはStartInfoクラスがあります。ここにエンコードを指定するプロパティがあり、UTF-8に設定します。
Process.StartInfo.StandardOutputEncoding = Encoding.UTF8;
コードサンプル
Process process = new Process();
// コマンド名
process.StartInfo.FileName = command;
// 引数
process.StartInfo.Arguments = argument;
// StandardOutputで結果を受け取るために必要な設定
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardOutput = true;
// StandardOutputのエンコード設定
process.StartInfo.StandardOutputEncoding = Encoding.UTF8;
// 実行
process.Start();
//プログラムが実行完了するまで待つ
process.WaitForExit();
//結果格納
var str = process.StandardOutput.ReadToEnd();
//プロセス終了
process.Close();