五年前在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
这是什么?如何解决?
答案 0 :(得分:0)
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