java - 如何处理 ProcessBuilder 命令中的编码?

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

它是什么?如何解决?

最佳答案

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-8file.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/

相关文章:

java - 如何在java swing中同时执行两个线程?

java - Netbeans 相当于 Eclipse 的 LogCat,用于查看 Java 日志

linux - 如何使用 awk 删除 file1 的行,其第 1 列值存在于 Ubuntu 的 file2 中?

python - 如何使用python从unicode转换

java - 从 JSON 对象获取空数据

linux - 用多个尾随模式替换行

c++ - 成功执行boost::filesystem::last_write_time需要哪些权限?

c - 如何测试我的应用程序是否兼容 UNICODE?

python - 使用 PIL 渲染表情符号

java - 如何使用 HashSet 查找两个 Comparable 数组中的共同元素?