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に送れば大丈夫っぽいです。
ものすごい初歩的な質問で申し訳ないのですが、
返信削除自分で作成したJavaのクラスを(当記事のTestClass)をPHPで使用する方法をご教授いただけませんでしょうか。
php側でimportすればいいかと思ったのですが、うまくいかないようでして。
classファイルを配置する場所、phpでの読込ませ方を
ご教授いただけませんでしょうか。
こんにちは、コメントありがとうございます。
返信削除javaのclassはquercusの読み込みを実行する側のjavaが参照可能な形になっていればOKです。
php側で利用するには、importをつかってクラスが参照できる形にしてから
アクセスすれば利用できます。
元々java側でnewしてつかっているものをphp側で参照させる方法のいい方法がわからなかったので、僕はsingletonを介して参照させるというプログラムを書いていました。
https://github.com/taktod/QuercusTest
簡単なテストコード書いてみたので、よかったらどうぞ。