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

Как я могу наилучшим образом угадать кодировку, когда спецификация (знак байтового заказа) отсутствует?

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

4b9b3361

Ответ 1

Возможно, вы можете выложить на Python script, который использует Chardet: универсальный детектор кодирования. Это повторная реализация обнаружения кодировки символов, используемая Firefox, и используется много разных приложений. Полезные ссылки: код Mozilla, исследовательский документ, он основывался на (по иронии судьбы, мой Firefox не смог правильно определить кодировку этой страницы), короткое объяснение, подробное объяснение.

Ответ 3

Мое предположение:

  • Сначала проверьте, имеет ли файл байтовые значения меньше 32 (кроме полей tab/newlines). Если это так, это не ANSI или UTF-8. Таким образом - UTF-16. Просто нужно разобраться в контенте. Для этого вы, вероятно, должны использовать некоторую таблицу действительных кодов символов Unicode. Если вы столкнулись с недействительными кодами, попробуйте другой аргумент, если это соответствует. Если они подходят (или нет), проверьте, какой из них имеет больший процент буквенно-цифровых кодов. Кроме того, вы можете попробовать найти строки для разрывов строк и определить их сущность. Помимо этого, у меня нет никаких идей, как проверить подлинность.
  • Если файл не содержит значений меньше 32 (кроме указанного пробела), это, вероятно, ANSI или UTF-8. Попробуйте разобрать его как UTF-8 и посмотреть, есть ли у вас какие-либо недопустимые символы Unicode. Если вы это сделаете, это, вероятно, ANSI.
  • Если вы ожидаете документы в неанглийских однобайтовых или многобайтовых кодировках, отличных от Юникода, то вам не повезло. Лучшее, что вы можете сделать, это нечто вроде Internet Explorer, которое создает гистограмму символов и сравнивает его с гистограммами известных языков. Он работает довольно часто, но иногда терпит неудачу. И вам нужно будет иметь большую библиотеку гистограмм букв для каждого языка.

Ответ 4

ASCII? Никакая современная ОС не использует ASCII. Все они используют 8-битные коды, по крайней мере, это означает UTF-8, ISOLatinX, WinLatinX, MacRoman, Shift-JIS или что-то еще там.

Единственный тест, который я знаю, - проверить недействительные символы UTF-8. Если вы найдете что-нибудь, тогда вы знаете, что это не может быть UTF-8. То же самое возможно для UTF-16. Но когда он не будет установлен в Unicode, тогда будет сложно определить, какая из кодовых страниц Windows может быть.

Большинство редакторов, с которыми я знаю, справляются с этим, позволяя пользователю выбрать значение по умолчанию из списка всех возможных кодировок.

Существует код для проверки правильности символов UTF.