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

27

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

  • 1
    Спасибо за редактирование! ChsDet, кажется, работает!
Теги:
algorithm
delphi-2009
encoding
byte-order-mark

4 ответа

8
Лучший ответ

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

  • 0
    Оооо. Это именно тот тип алгоритма, который я ищу. Теперь, если бы я мог выяснить, как это работает, или просто найти эквивалент Delphi ...
  • 0
    Согласно документации, это Python-порт Mozilla cpp-кода. Последний находится по адресу mxr.mozilla.org/seamonkey/source/extensions/universalchardet/… Не знаю, какое воплощение легче перенести!
Показать ещё 2 комментария
4

Вот как это делает блокнот

Существует также python Universal Encoding Detector, который вы можете проверить.

  • 2
    MS скрыл факты
  • 0
    IsTextUnicode - хороший первый шаг. Затем он говорит, что использует ietf.org/rfc/rfc2279.txt?number=2279 для определения UTF-8, но это не говорит о том, что тестировать.
Показать ещё 2 комментария
3

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

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

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

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

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

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

  • 0
    Извините, я имею в виду не ANSI, не ASCII. Я отредактирую это.
  • 0
    В Windows все еще есть драйверы устройств. Если ваш код ядра не 7-битный, вы пожалеете об этом.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню