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

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

После некоторого опроса я пришел к выводу, что в java-мире есть несколько проектов обнаружения кодирования, если getEncoding in InputStreamReader не работает:

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

4b9b3361

Ответ 1

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

  • 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, и в случае, если он возвращает null, потому что это не удалось, попробуйте использовать juniversalchardet. Или наоборот.

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

Ответ 2

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

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. Я обновляю сообщение с его результатом.

Ответ 3

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

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