DefaultEncodingとSetStandardOutputの設定の順番

C#からIronPythonを使ってみようとしたら,文字化けしてえらく長いこと詰まってしまった.

Pythonのコードからprint文とかで出力した内容をC#側で受け取るには,PythonEngine.SetStandardOutputを設定すればいいはず.エンコードはPythonEngine.Sys.DefaultEncodingを設定すればいい.そう思って試してたんだけど,日本語の出力が「????」って感じにハテナに置き換わったままで全然エンコードの設定が効いていなかった.

原因はSetStandardOutputを先に設定したこと.
どうやらDefaultEncodingを先に設定してSetStandardOutputを設定しないとエンコードの設定が効かないらしい.

そんな感じで無事に期待通りに動くようになったコード

PythonEngine pythonengine = new PythonEngine();
MemoryStream mstream = new MemoryStream();

pythonengine.Sys.DefaultEncoding = Encoding.UTF8;
pythonengine.SetStandardOutput(mstream);

pythonengine.ExecuteToConsole("print 'はろー'");
MessageBox.Show(Encoding.UTF8.GetString(mstream.GetBuffer()));

この手のエンコードの仕組みはイマイチ分からずに困ることが多い.