PythonEngineの文字コード
C#でGUI、文字列処理をIronPythonでやろうと思ったら、文字列処理ではまる。
C#のコード
string sss = "テストデータでござるよ\n文字列です。"; PythonEngine python_engine = new PythonEngine(); python_engine.Globals.Add("sss", sss); python_engine.ExecuteFile(".\\..\\iron_python.py"); string v = python_engine.EvaluateAs<string>("retval"); MessageBox.Show(v);
IronPythonのコード
import sys #デバッグ用 f = open( 'dbg.log' , 'w' ) f.write( sss ) ; f.close() lines = sss.splitlines() #最初に見つかった行のデータを返す。 retval = '見つかりません' for x in lines : result = x.find( "文字列" ) if result != -1 : retval = x
C#はUTF-8、pythonもUTF-8だから問題ないと考えていたのに、C#から渡した文字列からの検索も成功しないし、retvalで返す値を表示しても文字化けする。
IronPython側でsys.getdefaultencoding()を呼ぶと、'us-ascii'が返るので、これが原因かと色々試してみる。iron_python.pyをutf-8で保存してもダメ、u'見つかりません'に変更しても上手くいかなかったが、iron_python.pyの一行目に# -*- coding: utf-8 -*-を記述したら文字列の検索が成功し、IronPythonからC#に渡した値の文字化けが解消された。
それでも、デバッグ用に出力したファイルの文字化けはそのまま。IronPythonにはcodecsモジュールもない。この問題を解決するにはC#側でPythonEngineをnewした後に以下を実行する。
python_engine.Sys.DefaultEncoding = Encoding.UTF8;