使用 ProcessBuilder ,我需要能够将非ASCII参数发送到另一个Java程序。
ProcessBuilder
在这种情况下,程序 Abc 需要通过参数向 Def 程序发送阿拉伯字符。我控制 Abc 代码,但不控制 Def 。
Abc
Def
使用常规的 ProcessBuilder 方式不需要任何的编码,它被提到了 这里 ,这是不可能的。 Def 收到问号“?”。
然而,我能够得到一些结果,但不同的编码可以用于不同的场景。
我正在尝试将所有编码发送给收件人,并比较所期望的结果。
UTF-8
windows-1252
windows-1254
windows-1258
CESU-8
ISO-8859-1
ISO-2022-CN
ISO-2022-KR
ISO-8859-15
ISO-8859-9
x-IBM1129
x-ISO-2022-CN-CNS
x-ISO-2022-CN-GB
我的问题是:如何以编程方式知道使用哪种正确的编码,因为我需要一些通用的东西?
换句话说,默认字符集和找到的字符集之间的关系是什么?
public class Abc { private static final Path PATH = Paths.get("."); // With maven: ./target/classes public static void main(String[] args) throws Exception { var string = "hello أحمد"; var bytes = string.getBytes(); System.out.println("Original string: " + string); System.out.println("Default charset: " + Charset.defaultCharset()); for (var c : Charset.availableCharsets().values()) { var newString = new String(bytes, c); var process = new ProcessBuilder().command("java", "-cp", PATH.toAbsolutePath().toString(), "Def", newString).start(); process.waitFor(); var output = asString(process.getInputStream()); if (output.contains(string)) { System.out.println("Found " + c + " " + output); private static String asString(InputStream is) throws IOException { try (var reader = new BufferedReader(new InputStreamReader(is))) { var builder = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { if (builder.length() != 0) { builder.append(System.lineSeparator()); builder.append(line); return builder.toString();