如何通过JRuby将Java char数组作为参数正确传递给Ruby脚本?

时间:2016-05-06 09:17:15

标签: java ruby jruby

我使用JRuby 9.0.5.0以便能够从Java调用Ruby脚本。我想将包含密码的char数组传递给Ruby脚本,但显然我做错了,因为我的脚本只有在使用普通字符串时才有效。

script.rb包含以下功能:

def action(user, password)

从Java开始,我通常可以调用此函数,但如果passwordString,我只能得到预期的结果(即没有异常):

ScriptEngineManager m = new ScriptEngineManager();
ScriptEngine jruby = m.getEngineByName("jruby");

...

jruby.put("user", "TestUser");
jruby.put("password", "xyz!"); // I'd like to pass "xyz!" as a char array.

// Call the script. Works as expected because password is a String.
String result = (String)jruby.eval("action($user, $password)");

我的第一次尝试是尝试传递这样的密码:

char[] password = { 'x', 'y', 'z', '!' };
jruby.put("password", password);
...

但这导致了异常

  

NoMethodError:未定义的方法`encoding' for char [x,y,z,!] @ 30abf79c:#                  encode_utf16le at ... / jruby-9.0.5.0 / lib / ruby​​ / gems / shared / gems / ruby​​ntlm-0.6.0 / lib / net / ntlm / encode_util.rb:42

如果我尝试在script.rb本身中明确设置密码,我会得到同样的错误,仅用于测试:

pwd = ['x', 'y', 'z', '!'].to_s
# use pwd inside the script ...

接下来,我尝试强制使用UTF-8编码:

pwd = ['x', 'y', 'z', '!'].to_s
pwd = pwd.force_encoding("UTF-8")
# use pwd inside the script ...

导致源自脚本内部使用的gem的不同错误,即授权错误。如果我使用" UTF-16"。

,也会发生同样的情况

脚本本身使用的Ruby gem,即使用密码的内部函数调用本身是否仅适用于特定编码的字符串?或者我做错了什么?我对Ruby几乎一无所知,只是想把它们粘在一起。

2 个答案:

答案 0 :(得分:1)

解决方案是在Ruby脚本中使用password.to_a.pack('U*')

爪哇:

char[] password = { 'x', 'y', 'z', '!' };
jruby.put("password", password); // jruby is of type ScriptEngine

Ruby script.rb:

password_to_use = password.to_a.pack('U*')

答案 1 :(得分:0)

~~ ['x','y','z','!'].to_java(:char)将Ruby数组转换为Java char[] ~~

char[] password = { 'x', 'y', 'z', '!' };
jruby.put("password", new String(password)); // jruby is of type ScriptEngine