五年前在 coderanch 上发布了一个非常相似的问题,但没有得到任何答案:http://www.coderanch.com/t/463055/java-io/java/handle-charset-ProcessBuilder
这是我的代码:
new ProcessBuilder("/bin/bash", "-c", "echo тест | hexdump").start();
这是我的期望:
0000000 d1 82 d0 b5 d1 81 d1 82
这是我在另一台 Linux 机器上得到的:
0000000 f2 e5 f1 f2
它是什么?如何解决?
最佳答案
ProcessBuilder
中的编码指的是file.encoding
系统属性。
例如,当您有以下来源时:
import java.io.*;
class Main {
public static void main(String args[]) throws Exception {
ProcessBuilder pb = new ProcessBuilder("/bin/bash", "-c", "echo -n тест | hexdump -C");
Process p = pb.start();
InputStream is = p.getInputStream();
printInputStream(is);
p.waitFor();
}
public static void printInputStream(InputStream is) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(is));
try {
for (;;) {
String line = br.readLine();
if (line == null) break;
System.out.println(line);
}
} finally {
br.close();
}
}
}
您将获得 f2 e5 f1 f2
如果编码如 Windows-1251
是运行时环境中的默认编码(或者您已将 Windows-1251
显式设置为 file.encoding
)。$ java -Dfile.encoding=Windows-1251 Main
00000000 f2 e5 f1 f2 |....|
00000004
您应该设置 UTF-8
至 file.encoding
如果你想得到 d1 82 d0 b5 d1 81 d1 82
其结果。$ java -Dfile.encoding=UTF-8 Main
00000000 d1 82 d0 b5 d1 81 d1 82 |........|
00000008
关于java - 如何处理 ProcessBuilder 命令中的编码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24802042/