如何在java中为外部程序调用指定参数编码

如何在java中为外部程序调用指定参数编码,java,encoding,Java,Encoding,我想用一个包含德语字母的参数启动一个外部程序,如下所示: ProcessBuilder pb = new ProcessBuilder("myScript.sh", "argument_with_letters_äöü"); Process p = pb.start(); 我的JVM(在我的例子中是JBoss AS)是以编码ISO 8859-15开始的。但是,外部程序“myScript.sh”需要UTF-8 有没有办法将我的参数编码为

我想用一个包含德语字母的参数启动一个外部程序,如下所示:

ProcessBuilder pb = new ProcessBuilder("myScript.sh", "argument_with_letters_äöü");     
Process p = pb.start();
    
我的JVM(在我的例子中是JBoss AS)是以编码ISO 8859-15开始的。但是,外部程序“myScript.sh”需要UTF-8

有没有办法将我的参数编码为UTF-8?我浏览了网页,但没有找到答案。

查看(负责在非Windows JRE中启动进程的包私有类-我假设您不在Windows上,因为扩展名为
.sh
),进程参数总是使用运行JRE的默认编码转换为字节:

byte[][] args = new byte[cmdarray.length-1][];
// ...
for (int i = 0; i < args.length; i++) {
    args[i] = cmdarray[i+1].getBytes();

(或者,如果您控制了
myScript.sh
,那么请修改它,使其文件名在stdin上,而不是作为参数)

我不确定您是否了解编码是什么,或者它在上下文中的含义。@Boristeider:如何?Java正在使用一些编码对命令行参数进行编码,而接收应用程序将使用一些编码再次对它们进行解码。这些应该匹配。
// xargs -0 expects arguments on stdin separated by NUL characters
ProcessBuilder pb = new ProcessBuilder("xargs", "-0", "myScript.sh");
pb.environment().put("LANG", "de_DE.UTF-8"); // or whatever locale you require
Process p = pb.start();
OutputStream out = p.getOutputStream();
out.write("argument_with_letters_äöü".getBytes("UTF-8")); // convert to UTF-8
out.write(0); // NUL terminator
out.close();