如何通过 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 开始,我可以正常调用此函数,但如果 password
是 String
:[=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*')
我正在使用 JRuby 9.0.5.0 以便能够从 Java 调用 Ruby 脚本。我想将包含密码的字符数组传递给 Ruby 脚本,但显然我做错了什么,因为我的脚本只有在我使用普通字符串时才有效。
script.rb
包含以下函数:
def action(user, password)
从 Java 开始,我可以正常调用此函数,但如果 password
是 String
:[=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*')