[英]Java: Runtime.exec() and Unicode symbols on Windows: how to make it work with non-English letters?
我正在使用Runtime.exec()来执行一些外部命令,并且我正在使用包含非英文字符的参数。 我只想运行这样的东西: python test.py шалом
它直接在 cmd 中正常工作,但通过Runtime.exec.getRuntime()("python test.py шалом")
错误处理
在 Windows 上,我的外部程序由于传递给它的未知符号而失败。
我记得 2010 年代早期的类似问题(!) - JDK-4947220 ,但我认为它自 Java 核心 1.6 以来已经修复。
操作系统:名称 Microsoft Windows 10 Pro(版本 10.0.18362 Build 18362)
Java: jdk1.8.0_221
要理解这个问题 - 最好的方法是使用下面列出的代码片段:
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class MainClass {
private static void foo(String filename) {
try {
BufferedReader input = new BufferedReader(
new InputStreamReader(
Runtime.getRuntime().exec(filename).getInputStream()));
String line;
while ((line = input.readLine()) != null) {
System.out.println(line);
}
input.close();
} catch (Exception e) { /* ... */ }
}
public static void main(String[] args) {
foo("你好.bat 你好"); // ??
foo("привет.bat привет"); // ??????
foo("hi.bat hi"); // hi
}
}
其中 .bat 文件只包含简单的@echo %1
输出将是:
??
??????
hi
PS System.out.println("привет")
- 工作正常并正确打印所有内容
1) 这个问题是否与 utf-8 utf-16 格式有关?
2)如何解决这个问题? 我不喜欢这个答案,因为它看起来是一个非常危险和丑陋的解决方法。
3)有谁知道为什么批处理文件的文件名没有被破坏并且可以找到这个文件,但是参数被破坏了? 可能是@echo
问题?
是的,问题与 UTF 有关。 理论上,执行 bat 文件的cmd
设置 65001 代码页应该可以解决这个问题(以及从 Java 端将 UTF-8 字符集设置为默认值)
不幸的是,Windows 中存在一个错误,这里提到了Java、Unicode、UTF-8 和 Windows 命令提示符
所以没有简单而完整的解决方案。 可以做的是为java
和cmd
设置相同的默认语言特定编码,如 cp1251 Cyrillic 。 并非所有语言都能在 windows 编码中得到很好的体现,例如中文就是其中之一。
如果windows系统有一些非技术限制,将所有cmd
进程的默认编码更改为特定于语言的编码,java代码会更复杂。 开始时,必须创建新的 cmd 进程,并且其 stdin/stdout 流应附加带有 UTF-16LE(用于`cmd /U' 进程)的读取器和来自不同线程的带有 CP1251 的写入器。 从java发送到stdin的第一个命令应该是'chcp 1251',第二个是带有参数的bat文件的名称。
完整的解决方案仍然可以使用 UTF-16LE 来读取 cmd 输出,但要传入文本,应使用其他通用编码,例如 base64,这再次导致复杂性增加
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.