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

StackOverflow https://stackoverflow.com/questions/373081

Вопрос

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


Ответ:

Ответ Шривацара привел меня к поиску в Google "универсального детектора кодирования delphi", который удивил меня тем, что этот пост занял позицию № 1 после того, как был жив всего около 45 минут!Это быстрый поиск в Google!!А также удивительно, что Stackoverflow так быстро выходит на 1-е место.

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

Я нашел упоминание о Delphi на этой странице, и это привело меня прямо к бесплатный детектор кодировок ChsDet с открытым исходным кодом в SourceForge написан на Delphi и основан на компоненте i18n от Mozilla.

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

Это было полезно?

Решение

Может быть, вы можете раскошелиться на скрипт Python, который использует Шардэ:Универсальный Детектор Кодирования.Это повторная реализация метода определения кодировки символов, который используется Firefox и используется множество различных приложений.Полезные ссылки: Код Mozilla, исследовательская работа это было основано на (по иронии судьбы, мой Firefox не может правильно определить кодировку этой страницы), краткое объяснение, подробное объяснение.

Другие советы

Вот как notepad это делает

Существует также универсальный Детектор кодирования python что вы можете проверить.

Мое предположение таково:

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top