Intro
Я использую Runtime.exe c () для выполнения какой-либо внешней команды, и я использую параметры, содержащие не-Engli sh символов . Я просто хочу запустить что-то вроде этого: python test.py шалом
Он работает правильно в cmd напрямую, но неправильно обрабатывается через Runtime.exec.getRuntime()("python test.py шалом")
Вкл Windows мой внешняя программа не работает из-за неизвестных символов, переданных ей.
Я помню аналогичная проблема с начала 2010-х (!) - JDK-4947220 , но я думал, что это уже исправлено начиная с Java core 1.6.
Среды:
ОС: Имя Microsoft Windows 10 Pro (версия 10.0.18362, сборка 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
?