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

时间:2014-11-09 11:11:38

标签: 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。

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

1 个答案:

答案 0 :(得分:3)

查看the code for java.lang.ProcessImpl(负责在非Windows JRE中启动进程的包私有类 - 我假设您在.sh扩展名下不在Windows上),进程参数为< em>始终使用正在运行的JRE的默认编码转换为字节:

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

所以没有办法直接这样做。但是,如果您不需要将任何标准输入传递给xargs,则可以使用myScript.sh命令解决此问题。 xargs的目的是从其标准输入中获取数据并将其转换为另一个可执行文件的命令行参数:

// 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();

(或者如果您拥有myScript.sh的控制权,那么修改 it 以期望其在stdin上的文件名而不是参数)