Какой самый точный детектор кодирования?

После определенного опроса я обнаружил, что в мире Java есть несколько проектов по обнаружению кодирования, если getEncoding в InputStreamReader не работает:

  1. juniversalchardet
  2. jchardet
  3. cpdetector
  4. ICU4J

Тем не менее, я действительно не знаю, что является лучшим среди всех. Может кто-нибудь с практическим опытом сказать мне, какой из них является лучшим в Java?

3 ответа

Я проверил juniversalchardet и ICU4J на некоторых файлах CSV, и результаты противоречивы: у юниверсалчарде были лучшие результаты:

  • UTF-8: оба обнаружены.
  • Windows-1255: обнаружил juniversalchardet, когда на нем было достаточно букв иврита, ICU4J все еще думал, что это ISO-8859-1. С еще большим количеством букв на иврите ICU4J обнаружил его как ISO-8859-8, что является другой кодировкой на иврите (и поэтому текст был в порядке).
  • SHIFT_JIS (японский): обнаружен juniversalchardet, и ICU4J решил, что это ISO-8859-2.
  • ISO-8859-1: обнаружен ICU4J, не поддерживается juniversalchardet.

Поэтому следует подумать, с какими кодировками ему, скорее всего, придется иметь дело. В итоге я выбрал ICU4J.

Обратите внимание, что ICU4J все еще поддерживается.

Также обратите внимание, что вы можете захотеть использовать ICU4J, и в случае, если он возвращает ноль, потому что это не удалось, попробуйте использовать juniversalchardet. Или наоборот.

AutoDetectReader из Apache Tika делает именно это - сначала пытается использовать HtmlEncodingDetector, затем UniversalEncodingDetector(который основан на juniversalchardet), а затем пытается Icu4jEncodingDetector(основан на ICU4J).

Я нашел ответ онлайн:

http://fredeaker.blogspot.com/2007/01/character-encoding-detection.html

Здесь сказано что-то ценное:

Сила детектора кодировки символов заключается в том, сосредоточен ли он на статистическом анализе или на открытии прологов HTML META и XML. Если вы обрабатываете файлы HTML, которые имеют META, используйте cpdetector. В противном случае лучшим вариантом будет либо monq.stuff.EncodingDetector, либо com.sun.syndication.io.XmlReader.

Вот почему я сейчас использую cpdetector. Я буду обновлять пост с результатом этого.

Я лично использовал jchardet в нашем проекте (в то время juniversalchardet не был доступен), чтобы проверить, был ли поток UTF-8 или нет.

Интегрировать с нашим приложением было проще, чем с другим, и это дало отличные результаты.

Другие вопросы по тегам