我使用JRuby 9.0.5.0以便能够从Java调用Ruby脚本。我想将包含密码的char数组传递给Ruby脚本,但显然我做错了,因为我的脚本只有在使用普通字符串时才有效。
script.rb
包含以下功能:
def action(user, password)
从Java开始,我通常可以调用此函数,但如果password
是String
,我只能得到预期的结果(即没有异常):
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 / 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几乎一无所知,只是想把它们粘在一起。
答案 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