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

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

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

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

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

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

Существует также Apache Tika – инструментарий анализа контента . Он может угадать тип mime, и он может угадать кодировку. Обычно предположение верно с очень высокой вероятностью.

Вот мой фаворит: http://glaforge.free.fr/wiki/index.php?wiki=GuessEncoding

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

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

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

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

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

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

Проверьте jchardet

Должны быть уже имеющиеся материалы

google поиск включен icu4j

или

http://jchardet.sourceforge.net/

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

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

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

Interesting Posts

Как создать classы Java из файла WSDL

Контекст среды Entity как статический

JQuery Star Rating

Неопределенная ссылка на статический constexpr char

Dropbox выборочная синхронизация – возможно ли, чтобы новые папки, созданные на других устройствах, не были автоматически добавлены в папки синхронизации на текущем устройстве?

Игнорировать выбросы в ggplot2 boxplot

Мое ядро ​​2 quad q6600 составляет 90 с, а в BIOS (монитор H / W) (с кулером intel share)

Как заставить NetworkManager установить соединение перед входом в систему?

Как рассчитать угол отскока?

Могу ли я заставить Windows иметь несколько паролей для одного пользователя?

Лучший способ получить местоположение пользователя GPS в фоновом режиме на Android

Аннотирование функционального интерфейса выражения Lambda

Как выполнить тройную загрузку

Как установить приложение по умолчанию для открытия одного файла в Windows 7 и 8?

Как работают алгоритмы преобразования изображений ASCII?

Давайте будем гением компьютера.