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

Posted

技术标签:

【中文标题】如何处理 ProcessBuilder 命令中的编码?【英文标题】:How to handle encoding inside ProcessBuilder commands? 【发布时间】:2014-09-08 05:40:22 【问题描述】:

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

这是什么?如何解决?

【问题讨论】:

您在使用Apache Commons Exec时是否遇到同样的问题? 第一个是16位编码,另一个显然是8位。 locale 命令在两台机器上打印什么? @GrzegorzŻur locale 在第一台机器上说LANG="en_US.UTF-8",在第二台机器上说LANG= 似乎 Java 使用提供的语言环境正确编码了字符串。差异可能是由第二台机器上的非 unicode 语言环境设置引起的。如果您希望另一台机器使用相同的编码,请尝试设置 unicode 支持并将语言环境设置为 xx_YY.UTF-8。 【参考方案1】:

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

如果像Windows-1251 这样的编码是您运行时环境中的默认编码(或者您已将Windows-1251 明确设置为file.encoding),您将获得f2 e5 f1 f2

$ java -Dfile.encoding=Windows-1251 Main
00000000  f2 e5 f1 f2                                       |....|
00000004

如果您想得到d1 82 d0 b5 d1 81 d1 82 作为结果,您应该将UTF-8 显式设置为file.encoding

$ java -Dfile.encoding=UTF-8 Main
00000000  d1 82 d0 b5 d1 81 d1 82                           |........|
00000008

【讨论】:

以上是关于如何处理 ProcessBuilder 命令中的编码?的主要内容,如果未能解决你的问题,请参考以下文章

如何处理 mongo 脚本中的命令行参数?

如何处理 AWS Redshift 卸载命令中的引用值?

如果我不想加载主窗体,如何处理 Winforms 中的命令行参数?

Linux中的find和grep命令对查找到的文件如何处理啊

“不知道如何处理' nvcc 致命错误

java中如何处理String args[]中的逗号