C# 文字化け問題解決

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();

参照

ProcessStartInfo.StandardOutputEncoding プロパティ