Проблема кодировки Java FileReader - PullRequest
121 голосов
/ 30 марта 2009

Я пытался использовать java.io.FileReader для чтения некоторых текстовых файлов и преобразования их в строку, но обнаружил, что результат неверно закодирован и вообще не читается.

Вот мое окружение:

  • Windows 2003, кодировка ОС: CP1252

  • Java 5,0

Мои файлы имеют кодировку UTF-8 или кодировку CP1252, и некоторые из них (файлы в кодировке UTF-8) могут содержать китайские (не латинские) символы.

Я использую следующий код для своей работы:

   private static String readFileAsString(String filePath)
    throws java.io.IOException{
        StringBuffer fileData = new StringBuffer(1000);
        FileReader reader = new FileReader(filePath);
        //System.out.println(reader.getEncoding());
        BufferedReader reader = new BufferedReader(reader);
        char[] buf = new char[1024];
        int numRead=0;
        while((numRead=reader.read(buf)) != -1){
            String readData = String.valueOf(buf, 0, numRead);
            fileData.append(readData);
            buf = new char[1024];
        }
        reader.close();
        return fileData.toString();
    }

Приведенный выше код не работает. Я обнаружил, что кодировка FileReader - CP1252, даже если текст в кодировке UTF-8. Но JavaDoc из java.io.FileReader говорит, что:

Конструкторы этого класса предполагают что кодировка символов по умолчанию и размер байтового буфера по умолчанию необходимо.

Значит ли это, что я не обязан сам устанавливать кодировку символов, если использую FileReader? Но в настоящее время я получил неправильно закодированные данные, как правильно справиться с ситуацией? Спасибо.

Ответы [ 4 ]

231 голосов
/ 30 марта 2009

Да, вам необходимо указать кодировку файла, который вы хотите прочитать.

Да, это означает, что вы должны знать кодировку файла, который вы хотите прочитать.

Нет, нет общего способа угадать кодировку любого заданного файла "простого текста".

Конструкторы FileReader всегда используют кодировку платформы по умолчанию, которая обычно плохая идея .

Вместо FileReader вам необходимо использовать new InputStreamReader(new FileInputStream(pathToFile), <encoding>).

77 голосов
/ 30 марта 2009

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

Если это «лучшее предположение» неверно, то вам нужно явно указать кодировку. К сожалению, FileReader не позволяет этого (основной недосмотр в API). Вместо этого вы должны использовать new InputStreamReader(new FileInputStream(filePath), encoding) и в идеале получить кодировку из метаданных о файле.

3 голосов
/ 07 декабря 2018

Начиная с Java 11, вы можете использовать это:

public FileReader(String fileName, Charset charset) throws IOException;
1 голос
/ 05 июня 2019

Для Java 7+ doc вы можете использовать это:

BufferedReader reader = Files.newBufferedReader(path, StandardCharsets.UTF_8);

Вот все Charsets Документ

Например, если ваш файл в CP1252, используйте этот метод

Charset.forName("windows-1252");

Вот другие канонические имена для кодировок Java как для IO, так и для NIO doc

Если вы не знаете точно, какую именно кодировку вы получили в файле, вы можете использовать сторонние библиотеки, такие как этот инструмент от Google this , который работает довольно аккуратно.

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