Java: кодировка UTF8 некорректно отображается в JTextArea

Я пытаюсь отобразить содержимое файла txt или docx в JTextArea, но текстовая область не отображает текст на армянском или русском языке. Включение UTF-8 в InputStreamReader не помогает:

public class TextReader {

    public static String getText(File textFile) throws IOException {
        FileInputStream fis = new FileInputStream(textFile);
        InputStreamReader isr  = new InputStreamReader(fis, "UTF8");
        BufferedReader br  = new BufferedReader(isr);
        StringBuilder text = new StringBuilder();

        String c;

        while ((c = br.readLine()) != null)
            text.append(c + "\n");

        fis.close();
        isr.close();
        br.close();

        return String.valueOf(text);
    }

}

Я использую этот статический метод в другом классе JTextArea:

        String text = TextReader.getText(currentFile);
        textArea.setText(text);

После запуска и выбора файла я получил случайные символы. Что могло бы быть решением в этом случае?

Используйте отладку, чтобы убедиться, что текст не поврежден Читателем. Проверьте шрифт, используемый JTextArea. Возможно, шрифт не поддерживает эти символы.

Steve11235 02.10.2018 19:04

Кроме того, действительно ли исходный файл закодирован в utf-8?

jtahlborn 02.10.2018 20:05

Я добавил universalchardet в класс TextReader для определения кодировки atuo, и это помогло. Кроме того, я добавил метод setFont для textArea, чтобы он получал правильную кодировку из класса TextReader и использовал ее.

Mikayel 03.10.2018 10:13

Кстати, какую версию Java вы используете? В Java 8 вы можете просто использовать return Files.lines(textFile.toPath()).collect(Collectors.joining("\‌​n"));. В Java 11 вы можете использовать return Files.readString(textFile.toPath()); для чтения всего файла за один раз.

Holger 05.10.2018 15:31
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
756
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Кажется, ваш код в порядке. Я предполагаю, что вы пытаетесь прочитать файл docx.

Таким образом вы не можете напрямую читать файлы docx. Используйте какую-нибудь библиотеку, например POI Apache.

Если вы действительно используете текстовый файл, возможно, приложение, которое вы используете для сохранения файла, использует неправильную кодировку. Вы можете попробовать сохранить некоторый (жестко закодированный) образец русского текста с использованием самой Java в текстовый файл и снова прочитать его на своем JTextArea.

Да, файл действительно был неправильно закодирован. Поэтому я добавил в класс функции universalchardet, чтобы не зависеть от кодировки файла. Для файлов Word я буду использовать Apache POI, спасибо!

Mikayel 03.10.2018 10:10

Другие вопросы по теме