Java IO с символами UTF - PullRequest
       4

Java IO с символами UTF

0 голосов
/ 14 февраля 2020

У меня странная проблема с файлами.

Я намереваюсь изменить время файла .srt, но запись нового файла кажется странной задачей.

Вот Пример кода, который я написал:

import java.io.*;
import java.nio.charset.Charset;

public class ReaderWriter {
    public static void main(String[] args) throws IOException {
        InputStream inputStream = new FileInputStream("D:\\E\\Movies\\English\\1960's\\TheApartment1960.srt");
        Reader reader = new InputStreamReader(inputStream,
                Charset.forName("UTF-8"));
        OutputStream outputStream = new FileOutputStream("output.srt");
        Writer writer = new OutputStreamWriter(outputStream,
                Charset.forName("UTF-8"));

        int data = reader.read();
        while (data != -1) {
            char theChar = (char) data;
            writer.write(theChar);
            data = reader.read();
        }
        reader.close();
        writer.close();
    }
}

Это изображение из исходного файла: enter image description here

Однако полученный файл выглядит так: enter image description here

Я много искал решение, но тщетно. Любая помощь, пожалуйста.

1 Ответ

2 голосов
/ 16 февраля 2020

Сначала несколько пунктов:

  • В вашем Java коде нет ничего плохого. Если я использую его для чтения входного файла, содержащего текст Arabi c, закодированный в UTF-8, он без проблем создает выходной файл, закодированный в UTF-8.
  • Не думаю, что существует проблема со шрифтом , Поскольку вы можете успешно отображать содержимое входного файла, нет никаких причин, по которым вы не можете также успешно отобразить содержимое действительного выходного файла.
  • Эти черные ромбы с вопросительными знаками в выходном файле являются символами замены , которые " используются для замены входящего символа, значение которого неизвестно или непредставимо в Unicode ". Это указывает на то, что входной файл, который вы читаете, не имеет кодировки UTF-8, хотя в коде прямо указано, что это так. Я могу воспроизвести результаты, аналогичные вашим, если входной файл имеет кодировку UTF-16, но указан в коде как UTF-8.
  • В качестве альтернативы, если входной файл действительно имеет кодировку UTF-8, укажите его как UTF-16 в коде. Например, вот правильный входной файл UTF-8 с некоторым текстом на арабском c, в котором указан код (неверно) Reader reader = new InputStreamReader(inputStream, Charset.forName("UTF-16"));:

    يونكود في النظم القائمة وفيما يخص التطبيقات الحاسوبية، الخطوط، تصميم النصوص والحوسبة متعددة اللغات.

    А вот вывод файл, содержащий символы замены, потому что входной поток файла UTF-8 был неправильно обработан как UTF-16:

    ���⃙臙訠���ꟙ蓙苘Ꟙꛙ藘ꤠ���諘께딠�����ꟙ蓘귘Ꟙ동裘꣙諘꧘谠����꫘뗙藙諙蔠���⃙裘ꟙ蓘귙裘돘꣘ꤠ���⃘ꟙ蓙蓘뫘Ꟙꨮ�

Учитывая все это, просто Обеспечение правильного указания кодировки входного файла в конструкторе InputStreamReader() должно решить вашу проблему. Чтобы убедиться в этом, просто создайте другой входной файл и сохраните его с кодировкой символов UTF-8, а затем запустите свой код. Если это работает, то вы знаете, что проблема заключалась в том, что кодировка входного файла не была UTF-8.

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