Моя программа должна читать файлы, которые используют различные кодировки. Они могут быть ANSI, UTF-8 или UTF-16 (большой или маленький конец).
Когда у нас есть спецификация (байтовый порядок), у меня нет проблем. Я знаю, если файл UTF-8 или UTF-16 BE или LE.
Я хотел предположить, когда не было спецификации, что файл был ANSI. Но я обнаружил, что файлы, с которыми я имею дело, часто пропускают их спецификацию. Поэтому никакая спецификация не может означать, что файл ANSI, UTF-8, UTF-16 BE или LE.
Если в файле нет спецификации, какой способ лучше сканировать какой-либо файл и наиболее точно угадать тип кодирования? Я бы хотел быть рядом почти в 100% случаев, если файл ANSI и в высоком 90, если это формат UTF.
Я ищу общий алгоритмический способ определить это. Но я действительно использую Delphi 2009, который знает Unicode и имеет класс TEncoding, поэтому что-то конкретное для этого было бы бонусом.
Ответ:
Ответ ShreevatsaR заставил меня искать в Google "универсальный детектор детекции кодирования", который удивил меня тем, что этот пост был указан в позиции №1 после того, как он был жив всего лишь около 45 минут! Это быстро googlebotting! И также удивительно, что Stackoverflow попадает в первое место так быстро.
Вторая запись в Google была в блоге Fred Eaker на Обнаружение кодировки символов, в котором перечислены алгоритмы на разных языках.
Я нашел упоминание о Delphi на этой странице, и это привело меня прямо к Free Detector ChsDet Charset Detector в SourceForge, написанному на Delphi и на основе компонента Mozilla i18n.
Fantastic! Спасибо всем, кто ответил (все +1), спасибо ShreevatsaR, и еще раз спасибо Stackoverflow, за то, что помогли мне найти мой ответ менее чем за час!
Возможно, вы можете выложить на Python script, который использует Chardet: универсальный детектор кодирования. Это повторная реализация обнаружения кодировки символов, используемая Firefox, и используется много разных приложений. Полезные ссылки: код Mozilla, исследовательский документ, он основывался на (по иронии судьбы, мой Firefox не смог правильно определить кодировку этой страницы), короткое объяснение, подробное объяснение.
Существует также python Universal Encoding Detector, который вы можете проверить.
Мое предположение:
ASCII? Никакая современная ОС не использует ASCII. Все они используют 8-битные коды, по крайней мере, это означает UTF-8, ISOLatinX, WinLatinX, MacRoman, Shift-JIS или что-то еще там.
Единственный тест, который я знаю, - проверить недействительные символы UTF-8. Если вы найдете что-нибудь, тогда вы знаете, что это не может быть UTF-8. То же самое возможно для UTF-16. Но когда он не будет установлен в Unicode, тогда будет сложно определить, какая из кодовых страниц Windows может быть.
Большинство редакторов, с которыми я знаю, справляются с этим, позволяя пользователю выбрать значение по умолчанию из списка всех возможных кодировок.
Существует код для проверки правильности символов UTF.