JRubyにJavaから日本語渡して返してもらう。
2008/08/31
java
jruby
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
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
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);
}
}
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;
}
}
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;
}
}
: