Моя программа должна читать файлы, использующие различные кодировки. Это могут быть ANSI, UTF-8 или UTF-16 (с прямым или обратным порядком байтов).
Когда есть BOM (Byte Order Mark), у меня нет проблем. Я знаю, является ли файл UTF-8 или UTF-16 BE или LE.
Когда не было спецификации, я хотел предположить, что это файл ANSI. Но я обнаружил, что файлы, с которыми я работаю, часто не имеют своей спецификации. Следовательно, отсутствие спецификации может означать, что это файл ANSI, UTF-8, UTF-16 BE или LE.
Если у файла нет спецификации, как лучше всего просканировать часть файла и наиболее точно угадать тип кодировки? Я бы хотел быть почти в 100% случаев, если файл ANSI, и в высоких 90, если это формат UTF.
Я ищу общий алгоритмический способ определить это. Но на самом деле я использую Delphi 2009, который знает Unicode и имеет класс TEncoding, так что что-то специфическое для этого было бы бонусом.
Отвечать:
Ответ ShreevatsaR привел меня к поиску в Google "универсального детектора кодирования delphi", что удивило меня, когда этот пост оказался на позиции №1 после того, как был жив всего около 45 минут! Это быстрый googlebotting !! И еще удивительно, что Stackoverflow так быстро занял первое место.
Второй записью в Google была запись в блоге Фреда Икера на Обнаружение кодировки символов, в котором перечислены алгоритмы на разных языках.
Я нашел упоминание о Delphi на этой странице, и это привело меня прямо к бесплатному детектору кодировки ChsDet с открытым исходным кодом на SourceForge написан на Delphi и основан на компоненте Mozilla i18n.
Фантастика! Спасибо всем, кто ответил (всем +1), спасибо ShreevatsaR, и еще раз спасибо Stackoverflow, за то, что помог мне найти мой ответ менее чем за час!