Моя программа должна читать файлы, которые используют различные кодировки. Они могут быть 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, за то, что помогли мне найти мой ответ менее чем за час!