Предположение кодирования текста, представленного как байт [] в Java

Ваша проблема не в том, что вы выполняете свой код, а скорее в предположениях, которые вы должны сделать относительно путей к файлам, доступных внешних команд (если они вам нужны), необходимых прав доступа к файлам и других внешних факторов, которые на самом деле не подпадают под «Java» проблемный домен. Если вы не планируете использовать нативный код (через JNI), Java не будет вашей проблемой, ваша среда будет. Что возвращает нас к старой поговорке: «пиши один раз, тестируй везде».

35
задан knorv 8 November 2009 в 18:48
поделиться

6 ответов

Следующий метод решает проблему с использованием juniversalchardet , который является портом Java библиотеки обнаружения кодирования Mozilla.

public static String guessEncoding(byte[] bytes) {
    String DEFAULT_ENCODING = "UTF-8";
    org.mozilla.universalchardet.UniversalDetector detector =
        new org.mozilla.universalchardet.UniversalDetector(null);
    detector.handleData(bytes, 0, bytes.length);
    detector.dataEnd();
    String encoding = detector.getDetectedCharset();
    detector.reset();
    if (encoding == null) {
        encoding = DEFAULT_ENCODING;
    }
    return encoding;
}

Приведенный выше код был протестирован и работает как задумано. Просто добавьте juniversalchardet-1.0.3.jar в путь к классам.

Я тестировал как juniversalchardet , так и jchardet . Мое общее впечатление таково, что juniversalchardet обеспечивает лучшую точность обнаружения и лучший API из двух библиотек.

33
ответ дан 27 November 2019 в 15:40
поделиться

Вот мой любимый: https://github.com/codehaus/guessencoding

Это работает так:

  • Если есть спецификация UTF-8 или UTF-16 , верните эту кодировку.
  • Если ни в одном из байтов не установлен старший бит, вернуть ASCII (или вы можете заставить его вернуть 8-битную кодировку по умолчанию).
  • Если есть байты со старшим битом установленный бит, но они расположены в правильных шаблонах для UTF-8, вернуть UTF-8.
  • В противном случае вернуть кодировку платформы по умолчанию (например, windows-1252 в системе Windows с английской локалью).

Это может показаться чересчур упрощенным, но в моей повседневной работе точность превышает 90%.

4
ответ дан 27 November 2019 в 15:40
поделиться

Ответ Чи кажется наиболее многообещающим для реального использования. Я просто хочу добавить, что, по словам Джоэла Спольски, в свое время Internet Explorer использовал алгоритм угадывания на основе частоты:

http://www.joelonsoftware.com/articles/Unicode.html

Грубо говоря, все предполагаемый текст копируется и анализируется во всех возможных кодировках. Выигрывает тот синтаксический анализ, который лучше всего соответствует среднему профилю частотности слов (и букв?) Языка. Я не могу быстро понять, использует ли jchardet такой же подход, поэтому я подумал, что упомяну об этом на всякий случай.

1
ответ дан 27 November 2019 в 15:40
поделиться

Check out jchardet

0
ответ дан 27 November 2019 в 15:40
поделиться

Должно быть что-то уже доступно

поиск в Google показал icu4j

или

http://jchardet.sourceforge.net/

-1
ответ дан 27 November 2019 в 15:40
поделиться

Без индикатора кодировки вы никогда не узнаете наверняка. Однако вы можете сделать несколько умных предположений. См. Мой ответ на этот вопрос:

Как определить, содержит ли строка недопустимые закодированные символы

Используйте методы validUTF8 (). Если он возвращает true, трактуйте его как UTF8, иначе как Latin-1.

-1
ответ дан 27 November 2019 в 15:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: