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

How to correctly pass a Java char array as a parameter to a Ruby script via JRuby?

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

script.rb 包含以下函数:

def action(user, password)

从 Java 开始,我可以正常调用此函数,但如果 passwordString:[=22=,我只会得到预期的结果(即没有例外) ]

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: undefined method `encoding' for char[x, y, z, !]@30abf79c:# encode_utf16le at .../jruby-9.0.5.0/lib/ruby/gems/shared/gems/rubyntlm-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 几乎一无所知,只是想把它粘在一起。

~~['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

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

Java:

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*')