プログラマメモ2 - programmer no memo2

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

JRubyです。

javaからjrubyにパラメータを渡してそのパラメータとjrubyスクリプト側で設定した値をマッチさせたいと思ったのですが、日本語だとどうも上手くいかないです。

解決策がみつからないのでとりあえず実験コードです。
osx上で動作させているeclipseで実験
jdk1.5 jruby 1.1.3

条件

スクリプトファイルはsjisで保存。
スクリプトを読み込ませるときにsjis指定で読み込ませます。
ruby.setKCode(KCode.NONE);


出力
"\211\253\223\352"
"\346\262\226\347\270\204"
"abcd"
"abcd"


条件
スクリプトファイルはsjisで保存。
スクリプトを読み込ませるときにsjis指定で読み込ませます。
ruby.setKCode(KCode.SJIS);


出力
"沖縄"
"豐也\270\204"
"abcd"
"abcd"


条件
スクリプトファイルはutf8で保存。
スクリプトを読み込ませるときにutf8指定で読み込ませます。
ruby.setKCode(KCode.NONE);


出力
"\211\253\223\352"
"\346\262\226\347\270\204"
"abcd"
"abcd"


条件
スクリプトファイルはutf8で保存。
スクリプトを読み込ませるときにutf8指定で読み込ませます。
ruby.setKCode(KCode.UTF8);


出力
"\211\253\223\352"
"豐也ク?"
"abcd"
"abcd"


jrubyスクリプト
p "沖縄"
p $param
p "abcd"
p $param2


使ったjavaコード
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.runtime.GlobalVariable;
import org.jruby.runtime.builtin.IRubyObject;
import org.jruby.util.KCode;

public class JRUBYTest3 {

public static void main(String[] args) throws BSFException,
UnsupportedEncodingException, IOException {
String script = IOUtils
.getStringFromReader(new InputStreamReader(TestBSF_jruby.class
.getResourceAsStream("test_jruby_3_utf8.jruby"), "utf8"));
// String script = IOUtils
// .getStringFromReader(new InputStreamReader(TestBSF_jruby.class
// .getResourceAsStream("test_jruby_3_sjis.jruby"), "sjis"));
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");

ruby.defineVariable(new GlobalVariable(ruby, "$param", param));
ruby.defineVariable(new GlobalVariable(ruby, "$param2", param2));

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

}

: