如何处理 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 命令中的编码?的主要内容,如果未能解决你的问题,请参考以下文章
如果我不想加载主窗体,如何处理 Winforms 中的命令行参数?