jruby エンコード実験 その2 2008/08/30

JRubyです。

Javaから一部の処理をJRubyにまかせてその結果をJava側に戻すというプログラむをしたいのですが、日本語を渡してJRuby側でマッチさせようとしてくれません。
※僕が単純にまちがっている可能性大。

$paramにはJava側で"沖縄"を入れているとして、

if $param == "沖縄" then

をしたいのですが、失敗します。

いろいろ試してみました。
その結果、jruby側での値をいったんto_java_bytesを使って配列にしてそれをjava側でStringにして比較するという方法でマッチしました。

参考

JRubyスクリプト
p "沖縄"
p $param
b = String.from_java_bytes "沖縄".to_java_bytes
p b
$jruby_support::out("沖縄".to_java_bytes)
$jruby_support::out($param)

if $param == $jruby_support::convert("沖縄".to_java_bytes) then
print "yes okinawa \n"
else
print "not okinawa \n"
end

if $param == "沖縄" then
print "yes okinawa \n"
else
print "not okinawa \n"
end

if $param == Java::java::lang::String::new("沖縄".to_java_bytes) then
print "yes okinawa \n"
else
print "not okinawa \n"
end


結果
"\211\253\223\352"
"\346\262\226\347\270\204"
"\211\253\223\352"
*** out arg bytes
-119 -85 -109 -22
*** out arg string
-119 -85 -109 -22
yes okinawa
not okinawa
not okinawa


import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;

import org.apache.bsf.BSFException;
import org.apache.bsf.util.IOUtils;
import org.jruby.Ruby;
import org.jruby.javasupport.JavaEmbedUtils;
import org.jruby.javasupport.JavaUtil;
import org.jruby.runtime.GlobalVariable;
import org.jruby.runtime.builtin.IRubyObject;
import org.jruby.util.KCode;

public class JRUBYTest4 {

public static void main(String[] args) throws BSFException,
UnsupportedEncodingException, IOException {
String script = IOUtils
.getStringFromReader(new InputStreamReader(TestBSF_jruby.class
.getResourceAsStream("test_jruby_4.jruby"), "utf8"));
Ruby ruby = Ruby.newInstance();
//ruby.setKCode(KCode.SJIS);
//ruby.setKCode(KCode.UTF8);
//ruby.setKCode(KCode.NONE);

IRubyObject param = JavaEmbedUtils.javaToRuby(ruby, "沖縄");
IRubyObject param2 = JavaEmbedUtils.javaToRuby(ruby, "abcd");
IRubyObject jrubySupport = JavaEmbedUtils.javaToRuby(ruby, new JRubySupport());
ruby.defineVariable(new GlobalVariable(ruby, "$param", param));
ruby.defineVariable(new GlobalVariable(ruby, "$param2", param2));
ruby.defineVariable(new GlobalVariable(ruby, "$jruby_support", jrubySupport));

Object obj = ruby.evalScriptlet(script);
System.out.println(obj);
ruby.tearDown();
}

static public class JRubySupport {
public void out(String s) throws UnsupportedEncodingException {
System.out.println("*** out arg string");
for (byte b : s.getBytes()) {
System.out.print(b + " ");
}
System.out.println();

}
public void out(byte[] s) throws UnsupportedEncodingException {
System.out.println("*** out arg bytes");
for (byte b : s) {
System.out.print(b + " ");
}
System.out.println();

}
public String convert(byte[] b){
return new String(b);
}
public String convert(String s){
return s;
}
}

}

: