(Java) Как я могу читать текстовый файл, который может использовать различные кодировки, и выводить содержимое в текстовый файл, который выглядит нормально?

Я читаю файл и заменяю какой-то текст, а затем пишу новый файл построчно. Я использую следующий код для чтения и записи файла. Обычно проблем с файлами в кодировке CP1252 и UTF-8 не возникает, но когда я пытаюсь прочитать файл, закодированный в «UCS-2 LE BOM», сохраненный файл начинается с символов спецификации и содержит много пробелов. . Я знаю, что это связано с кодировкой, но я не знаю, нужно ли мне читать ее по-другому или сохранять по-другому. Кроме того, я знаю, что могу установить кодировку при чтении файла, но как я могу обрабатывать файлы с разной кодировкой, не зная, какой из них идет. У меня нет контроля над файлом, пока он не попадет в мой java-код. Любая помощь приветствуется, спасибо.

        FileInputStream sourceFileInputStream = new FileInputStream(sourceFile);
        DataInputStream sourceDataInputStream = new DataInputStream(sourceFileInputStream);

        BufferedReader sourceBufferedReader = new BufferedReader(
                new InputStreamReader(sourceDataInputStream));
        FileWriter targetFileWriter = new FileWriter(new File(targetFileLocation));
        BufferedWriter targetBufferedWriter = new BufferedWriter(
                targetFileWriter);
                  .
                  .
                  .
        targetBufferedWriter.write(newTextline);

person Kyle Peters    schedule 14.04.2017    source источник
comment
попробуйте с InputStreamReader и OutputStreamReader.   -  person Omore    schedule 14.04.2017
comment
Можете ли вы использовать команду file для определения правильного типа файла?   -  person Erich Kitzmueller    schedule 14.04.2017
comment
Обычно у вас должны быть метаданные, которые записывают кодировку символов для файла. Вы не всегда можете проверить его и определить правильную кодировку. Однако вы можете заглянуть в первые несколько байтов и определить, есть ли спецификация и ее порядок следования байтов. Различие между UTF-8 и Cp1252 не обязательно, если все содержимое находится в диапазоне ASCII, но в противном случае для угадывания потребуется прочитать весь файл и сделать вероятностное предположение о том, что верно.   -  person erickson    schedule 14.04.2017
comment
Может быть, это stackoverflow.com/questions /3759356/ тема с ответами, может поможет?   -  person Вардан Матевосян    schedule 14.04.2017


Ответы (1)


  1. Спецификация может указывать несколько кодировок, а не только UTF-8. См. статью Википедии Знак порядка следования байтов.

  2. При отсутствии спецификации вам не нужно читать весь файл, вы можете читать столько, сколько необходимо, пока не получите содержательную статистику. Часто достаточно 100 или около того байтов — однажды я написал программу, которая это делала. С другой стороны, есть определенный шанс, что даже если вы прочитаете весь файл, статистика не будет окончательной. Метод, который я использовал, был основан на частоте букв — частотах униграмм, биграмм и триграмм по языку, а также на связи кодировки с языком. При вычислении частот биграмм и триграмм я предлагаю рассматривать пробелы как таковые. Это будет учитывать частоту букв в начале и в конце слов. Таким образом, для «теперь есть» биграммами будут no, o_, i, is, s, t, th, he, e. См. подсчет частоты монограмм, биграмм и триграмм.

person Jonathan Rosenne    schedule 14.04.2017