Подтвердить что ты не робот

Угадывание кодировки текста, представленного как byte [] в Java

Учитывая массив байтов, представляющих текст в некоей неизвестной кодировке (обычно UTF-8 или ISO-8859-1, но не обязательно), какой лучший способ получить предположение для наиболее вероятной кодировки (в Java )?

Стоит отметить:

  • Дополнительные метаданные отсутствуют. Байт-массив - это единственный доступный вход.
  • Алгоритм обнаружения, очевидно, не будет на 100% правильным. Если алгоритм верен более чем в 80% случаев, которые достаточно хороши.
4b9b3361

Ответ 1

Следующий метод решает проблему с помощью 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 двух библиотек.

Ответ 3

Здесь мой любимый: http://glaforge.free.fr/wiki/index.php?wiki=GuessEncoding

Он работает следующим образом:

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

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

Ответ 4

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

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

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

Ответ 7

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

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

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