如何在ProcessBuilder命令中处理编码?

时间:2014-07-17 11:14:44

标签: java linux unicode character-encoding

五年前在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

这是什么?如何解决?

1 个答案:

答案 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
相关问题