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()));
この手のエンコードの仕組みはイマイチ分からずに困ることが多い.