gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 09:57:33 24 4
gpt4 key购买 nike

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

script.rb 包含以下函数:

def action(user, password)

从Java中,我通常可以调用这个函数,但如果password是一个String,我只能得到预期的结果(即没有异常(exception)):

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 几乎一无所知,只是想将它们粘合在一起。

最佳答案

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

Java:

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

Ruby 脚本.rb:

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

关于java - 如何通过 JRuby 将 Java 字符数组作为参数正确传递给 Ruby 脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37068620/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com