Java: Runtime.exe c () и символы Unicode на Windows: как заставить работать с не-английскими sh буквами? - PullRequest
1 голос
/ 30 января 2020

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?

1 Ответ

0 голосов
/ 30 января 2020
  1. Да, проблема связана с UTF. Теоретически настройка кодовой страницы 65001 для cmd, которая выполняет файлы bat, должна решить проблему (наряду с настройкой кодировки UTF-8 по умолчанию со стороны Java)

  2. К сожалению, есть ошибка в Windows с упоминанием здесь Java, Unicode, UTF-8 и Windows Командная строка

  3. Так что простого и полного решения не существует. Что можно сделать, это установить одинаковую кодировку c, заданную по умолчанию, например, cp1251 Cyrilli c, для java и cmd. Не все языки хорошо отражены в кодировках windows, например, одним из них является китайский.

Если в системе windows есть некоторые нетехнические ограничения на изменение кодировки по умолчанию для языка c один для всех cmd процессов код java будет более сложным. В начале должен быть создан новый процесс cmd и к его потокам stdin / stdout должен быть присоединен считыватель с UTF-16LE (для процесса `cmd / U ') и записывающее устройство с CP1251 из разных потоков. Первая команда, отправляющая в stdin с java должна быть 'chcp 1251', а вторая - это имя bat-файла с его параметрами.

Полное решение все еще может использовать UTF-16LE для чтения вывода cmd, но для передачи текст, необходимо использовать другое универсальное кодирование, например base64, что опять-таки приводит к усложнению

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...