Кодировка текстовых файлов Java

У меня есть текстовый файл, и это может быть ANSI (с кодировкой ISO-8859-2), UTF-8, UCS-2 Big или Little Endian.

Есть ли способ определить кодировку файла, чтобы прочитать его правильно?

Или возможно прочитать файл без указания кодировки? (и он читает файл как есть)

(Существует несколько программ, которые могут обнаруживать и преобразовывать кодировку / формат текстовых файлов.)

Ответы на вопрос(4)

есть несколько способов обнаружения кодировки символов, особенно в Java. Взгляни наjchardet который основан на алгоритме Mozilla. Есть такжеcpdetector и проект IBM под названиемICU4J, Я бы посмотрел на последнее, так как оно кажется более надежным, чем два других. Они работают на основе статистического анализа двоичного файла, ICU4j также обеспечит уровень достоверности обнаруженной им кодировки символов, чтобы вы могли использовать это в случае выше. Это работает довольно хорошо.

ый файл Unicode, то метка порядка байтов (BOM) должна сообщать вам всю необходимую информацию. ВидетьВот для более подробной информации о спецификации

Если это не так, вам придется использовать некоторую библиотеку обнаружения кодировки.

Решение Вопроса

знак порядка байтов в начале файла. Если это существует, то этодовольно хорошая ставка что файл в этой кодировке - но это не полная уверенность. Вы также можете обнаружить, что файлявляется в одной из этих кодировок, но не имеет метки порядка байтов.

Я не знаю много о ISO-8859-2, но я не удивлюсь, если почтикаждый файл является допустимым текстовым файлом в этой кодировке. Лучшее, что вы сможете сделать, - это проверить это эвристически. Действительно,Страница википедии Говоря об этом, можно предположить, что только байт 0x7f является недействительным.

Нет идеи прочитать файл «как есть» и получить текст - файл представляет собой последовательностьбайтовТаким образом, вы должны применить кодировку символов, чтобы декодировать эти байты в символы.

http://icu-project.org/apiref/icu4j/)

Вот мой код:

            String charset = "ISO-8859-1"; //Default chartset, put whatever you want

            byte[] fileContent = null;
            FileInputStream fin = null;

            //create FileInputStream object
            fin = new FileInputStream(file.getPath());

            /*
             * Create byte array large enough to hold the content of the file.
             * Use File.length to determine size of the file in bytes.
             */
            fileContent = new byte[(int) file.length()];

            /*
             * To read content of the file in byte array, use
             * int read(byte[] byteArray) method of java FileInputStream class.
             *
             */
            fin.read(fileContent);

            byte[] data =  fileContent;

            CharsetDetector detector = new CharsetDetector();
            detector.setText(data);

            CharsetMatch cm = detector.detect();

            if (cm != null) {
                int confidence = cm.getConfidence();
                System.out.println("Encoding: " + cm.getName() + " - Confidence: " + confidence + "%");
                //Here you have the encode name and the confidence
                //In my case if the confidence is > 50 I return the encode, else I return the default value
                if (confidence > 50) {
                    charset = cm.getName();
                }
            }

Не забудьте поставить все попытки поймать это нужно.

Я надеюсь, что это работает для вас.

Ваш ответ на вопрос