Какой самый точный детектор кодирования?
После определенного опроса я обнаружил, что в мире Java есть несколько проектов по обнаружению кодирования, если getEncoding
в InputStreamReader
не работает:
Тем не менее, я действительно не знаю, что является лучшим среди всех. Может кто-нибудь с практическим опытом сказать мне, какой из них является лучшим в 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 или нет.
Интегрировать с нашим приложением было проще, чем с другим, и это дало отличные результаты.