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

JRubyにJavaから日本語渡して返してもらう。 2008/08/31

JRubyです。

Javaから日本語を渡してJRuby側で判断して文字列を返すというコードを目指します。

ここ数日いろいろトライして結構検討はずれなことしてます。
※ここでやっていることは徒労なのかもしれませんが....

require "kconv"
を使ってスクリプト側で、日本語をtoutf8して、Java側から渡された文字列と比較するといい感じでした。
あとスクリプト側からJavaに返す際に、utf8してあげると、Java側でうまく表示できました。

使ったJavaはjava6です。
JRubyは、jruby-complete-1.1.2.jarです。実行は、eclipseで行いコンソールで出力を確認しています。

うまくいかなかったスクリプト

case v
when "沖縄"
"沖縄!!"
when "東京"
"東京!!"
when "神戸"
"神戸!!"
else
"該当せず。"
end


結果
?Y???????B



うまくいったスクリプト
require "kconv"して、文字列をtoutf8していってます。
こんなことしなくてもいいのかもしれないです。
require "kconv"
case v
when "沖縄".toutf8
"沖縄!!".toutf8
when "東京".toutf8
"東京!!".toutf8
when "神戸".toutf8
"神戸!!".toutf8
else
"該当せず。".toutf8
end


結果
沖縄!!


以下、Javaコードです。

package test_jruby;

import java.io.IOException;

import org.jruby.Ruby;

import static test_jruby.ExperimentationJRubyScriptBase.*;

public class Test_japanese_1 {

public static void main(String[] args) throws IOException {

Ruby ruby = Ruby.newInstance();

String script = script("test_japanese_1.jruby", "MS932");

String result = evalByJRuby(ruby, script, new Object[][]{{"v", "沖縄"}});

System.out.println(result);
}

}


package test_jruby;

import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

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

public class ExperimentationJRubyScriptBase {


/**
* <p>
* このメソッドで受け取るscriptはメソッド定義のされていない裸のスクリプトを想定しています。
* </p>
*
* @param ruby
* @param script
* @param objects
* @return
*/
public static String evalByJRuby(Ruby ruby, String script,
Object[][] objects) {

/*
* メソッド引数を作成する
*/
List<IRubyObject> list = new ArrayList<IRubyObject>();

//
final String M = "doprocess" + System.nanoTime();

StringBuilder builder = new StringBuilder();

builder.append("def " + M + " (");
if (objects != null) {
for (int i = 0; i < objects.length; i++) {
Object[] objects2 = objects[i];
if (2 <= objects2.length) {
builder.append(objects2[0].toString() + ",");
list.add(JavaUtil.convertJavaToRuby(ruby, objects2[1],
objects2[1].getClass()));
}
}

}

// 最後のカンマがあれば削除
if (builder.charAt(builder.length() - 1) == ',') {
builder.deleteCharAt(builder.length() - 1);
}
final String LS = System.getProperty("line.separator");
builder.append(")").append(LS).append(script).append("end");

script = builder.toString();
// System.out.println(script);
RubyRuntimeAdapter rubyRuntimeAdapter = JavaEmbedUtils
.newRuntimeAdapter();

IRubyObject[] params = new IRubyObject[list.size()];

list.toArray(params);

IRubyObject result = rubyRuntimeAdapter.eval(ruby, script).callMethod(
ruby.getCurrentContext(), M, params);

ruby.tearDown();

// System.out.println("*** " + result.getClass());

if (result instanceof org.jruby.RubyString) {
org.jruby.RubyString s = (org.jruby.RubyString) result;
return s.getUnicodeValue();
}
return result.toString();
}

static public String script(String filename, String enc) throws IOException {
String script = IOUtils.getStringFromReader(new InputStreamReader(
ExperimentationJRubyScriptBase.class
.getResourceAsStream(filename), enc));
return script;
}

}

: