[英]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.