環境依存になってしまうコーディングはやはり良くないということで、
oboe2uran.hatenablog.com
これをもう少し修正して、Eclipse環境の起動でも問題が起きないようにする。
Process起動で 渡すデータを、ユニコード文字列で渡して Python側でデコードして使えば良いのである。
Java 側、以下を使わせてもらいます。
JavaのUnicode文字列の変換用メソッド("あ" <-> "\u3042") - Qiita
このメソッドで充分です。
public static String convertToUnicode(String string){ if (string==null || string.isEmpty()) return ""; StringBuilder sb = new StringBuilder(); for(int i = 0; i < string.length(); i++){ sb.append(String.format("\\u%04X", Character.codePointAt(string, i))); } String unicode = sb.toString(); return unicode; }
前の、
JavaからProcess起動で Python 実行して PDF を作らせる。 - Oboe吹きプログラマの黙示録
のコードを以下のように修正します。(省略してます)
Java → Python 呼出し、、convertToUnicode メソッドを使います。
int sts = ScriptExecutor.run(()->"python /var/make_pdf.py /var/template.pdf /var/out.pdf" , ()->Arrays.asList( UnicodeTool.convertToUnicode("あ") , "\n", "ABC", "\n\n") , e->{ logger.debug("### stdout ###\n" + e); },(e, x)->{ logger.debug("### stderr ###\n" + e); logger.warn(x.getMessage(), x); });
make_pdf.py の変更、
inp = input('') の結果を取得して、
前のコードは、、
cc.drawString(100, y_pos, e)
でしたが、一度エンコードしてから、unicode-escape でデコードするようにすれば良い。
cc.drawString(0, y_pos, e.encode().decode('unicode-escape'))
これで、Eclipse でのコーディング作業中でも動作確認もやりやすくなります。
余計な変換処理をするわけですが、Java から、Python を動かして仕事をさせる処理は、
元々、遅くて構わない、覚悟の上の処理をさせる設計なわけで
そんなに気にすることないかもしれません。意外と高速でした。