2011年5月3日火曜日

QuercusでJavaからの日本語入力を取得して動作させる。

Quercusの内部設定をUTF-8で動作させ、ほかの環境がすべてUTF8の状態にしても、JavaのStringの状態で日本語を受け取ると化けまくります。
そこでなんとかしましょう。

まず成功事例
1:Java側のオブジェクトをbyteベースの文字列に変換
2:PHP側の文字列として取得
3:packで文字列に戻す。
これでうまくいきました。
また、PHP側で取得済みのStringオブジェクトを変換用のクラスに渡せばきちんと変換されました。
以下コード
0:変換対象のStringオブジェクトを応答する関数
public static String TestString() {
   return "あいうえお";
}
1:byte文字列に変換
public static String toByteString(Object o) {
   byte[] b = o.toString().getBytes();
   StringBuilder bs = new StringBuilder();
   String hex;
   for(int i = 0;i < b.length; i ++) {
      hex = Integer.toHexString(b[i]);
      bs.append(hex.substring(hex.length() - 2));
   }
   return bs.toString();
}
2,3PHP側
// 文字列取得
$testStr = TestClass::TestString();
echo $testStr; // 表示させてみる。
echo " ";

// byteストリングに変換
$val = TestClass::toByteString($testStr);
echo $val;
echo " ";

// packして文字列に戻す。
echo pack("H*", $val);
echo " ";
出力はこうなります。
BDFHJ e38182e38184e38186e38188e3818a あいうえお

Javaから文字列を受け取った文字列はひたすらtoByteStringに送れば大丈夫っぽいです。

2 件のコメント:

  1. ものすごい初歩的な質問で申し訳ないのですが、
    自分で作成したJavaのクラスを(当記事のTestClass)をPHPで使用する方法をご教授いただけませんでしょうか。
    php側でimportすればいいかと思ったのですが、うまくいかないようでして。
    classファイルを配置する場所、phpでの読込ませ方を
    ご教授いただけませんでしょうか。

    返信削除
  2. こんにちは、コメントありがとうございます。

    javaのclassはquercusの読み込みを実行する側のjavaが参照可能な形になっていればOKです。
    php側で利用するには、importをつかってクラスが参照できる形にしてから
    アクセスすれば利用できます。
    元々java側でnewしてつかっているものをphp側で参照させる方法のいい方法がわからなかったので、僕はsingletonを介して参照させるというプログラムを書いていました。

    https://github.com/taktod/QuercusTest
    簡単なテストコード書いてみたので、よかったらどうぞ。

    返信削除