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

Моя программа должна читать файлы, которые используют различные кодировки. Они могут быть 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 «универсального кодировочного детектора delphi», который удивил меня тем, что этот пост занял первое место после того, как был жив всего около 45 минут! Это быстрый Googlebotting! И еще удивительно, что Stackoverflow так быстро занимает 1-е место.

Второй записью в Google была запись в блоге Фреда Икера о Обнаружение кодировки символов , в которой перечислены алгоритмы на разных языках.

Я обнаружил упоминание о Delphi на этой странице, и я сразу же получил бесплатный OpenSource ChsDet Charset Detector в SourceForge , написанный на Delphi и основанный на компоненте Mozilla i18n.

Fantastic! Спасибо всем, кто ответил (все +1), спасибо ShreevatsaR, и еще раз спасибо Stackoverflow, за помощь в поиске моего ответа менее чем за час!

Ответы [ 4 ]

9 голосов
/ 17 декабря 2008

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

5 голосов
/ 17 декабря 2008

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

Существует также универсальный кодер Python , который вы можете проверить.

4 голосов
/ 17 декабря 2008

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

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

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

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

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

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

...