Проблема с кодировками

178
11 октября 2018, 14:50

Имеется утилита, которая запускает батники, которые в свою очередь собирают инфу с помощью утилиты wmic и потом с них форматирует отчет на рабочий стол.

Программа в общем-то ничего сложного не делает, обычная работа с файлами и текстом, если упростить, но проблема в том, что при чтении файла (в файле точно не UTF-8, word определил кодировку, как Юникод) поэтому геморрой с обработкой информации, с этим я в общем-то справился, вот только на ноутах она выдает дичь, где используется кириллица.

К слову к примеру если в строку я записываю кириллицу сам, то всё ок. Проблема только с файлом. Вот 1 из методов.

void networkAdapterGet() {
    StringBuilder result = new StringBuilder();
    try(BufferedReader reader = new BufferedReader(new FileReader(NETWORK_ADAPTER_INFO_PATH));
        BufferedWriter writer = new BufferedWriter(new FileWriter(TEMP_RESULT_FILE_PATH, true))) {
        line = reader.readLine();
        while (line != null){
            if (line.length() > 1){
                line = trimSpaces(line);
                line = networkAdapterProcessing(line);
                if (!line.equals("")){
                    result.append(line);
                    result.append(lineSeparator);
                }
            }
            line = reader.readLine();
        }
        writer.write("Сетевые устройства:");
        writer.write(lineSeparator);
        writer.write(result.toString());
        writer.write(lineSeparator);
        writer.write(lineSeparator);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

Скорее всего зря повелся наFileReader/Writer и думаю основная проблема, как раз таки в Reader'е. Пошаманил с кодировками на открытии и получил фигу, упало как раз таки из-за несовпадения кодировок, можно конечно перебрать вариантов там пара всего, но хотелось бы узнать можно ли как-то это дело исправить. Это пока единственный мешающий/раздражающий баг на данном этапе разработки утилитки.

Answer 1

Нужно писать в той кодировке, которая читается клиентом. Чтобы указать кодировку надо заменить FileWriter на

new OutputStreamWriter(new FileOutputStream(TEMP_RESULT_FILE_PATH), StandardCharsets.UTF_8);

если кодировка UTF_8 не подходит, то можно попробовать KOI-8 или CP1251, или другая кодировка, которая поддерживает кирилицу, например CP866.

Answer 2

Очень помог ответ, Roman C. Получилась немного громоздкая конструкция со всеми этими обертками, но вроде бы работает осталось поправить другой метод, а именно networkAdapterProcessing(), чтобы корректно отображался результат, да и остальные методы можно оставить без изменений потому, что проблема только в сетевых устройствах, но вот решение самой проблемы с кодировками получилась весьма интересной хотя бы для меня, я еще пока только учусь.

try(BufferedReader reader = 
                new BufferedReader(
                        new InputStreamReader(
                                new FileInputStream(NETWORK_ADAPTER_INFO_PATH), "Unicode"));
        BufferedWriter writer = 
                new BufferedWriter(
                        new OutputStreamWriter(
                                new FileOutputStream(TEMP_RESULT_FILE_PATH, true), "Unicode"))){

Так вот для того, чтобы определить кодировку достаточно было открыть файл клятым блокнотом и жамкнуть "Сохранить как", чтобы убедиться в том, что это Юникод. Причем пробовал вначале пересохранить в UTF-8, но там была полная борода. Сейчас конечно из-за того, что открывает с помощью другого инструмента сменилась и сама структура получаемой строки немного, но это уже мелочи по сравнению с раздражающей меня ошибкой с кодировкой. Как это у меня обычно и бывает проблема была в сути своей совсем не сложной, но мозги она заклинила неслабо. В будущем думаю исправлю, чтобы было все одинаково и не выделялось, но пока надо сделать хотя бы это. Спасибо вам за помощь.

READ ALSO
Не получается получить данные с DialogFragment

Не получается получить данные с DialogFragment

Есть адаптер который генерирует и обрабатываете клики по елементам, из него вызывается при нажатии на картинку fragmentDialog в котором есть edittextМы...

182
Переход из фрагмента в активити по кнопке

Переход из фрагмента в активити по кнопке

Не получается реализовать переход из фрагмента в активити по кнопкеПерерыв весь интернет, решила попросить о помощи, т

169
Как реализовать общение двух и больше компьютеров в java?

Как реализовать общение двух и больше компьютеров в java?

как реализовать общение между двумя и больше компьютеров? Читал что нужно использовать сокеты, но возможно есть и другой вариант? Раньше...

135
Вопрос связанный с методом Multiple

Вопрос связанный с методом Multiple

Можете помочь написать метод Multiple который создает две матрицы и умножает их

190