Как опознать кодировку по встречаемости знаков
Для кириллицы существует более десяти различных кодировок. Документ
может быть написан на любом из них. Каждая кодировка представляет
свой способ кодирования текста, а значит, должен иметь своё
характерное распределение частотности байт в документе.
Наиболее используемы строчные буквы, поэтому их байты будут наиболее
встречаемы. Также, помимо них, используемы прописные буквы. Они будут
упомянуты как второй диапазон. А другие знаки в сумме не будут
встречаться так часто, как и прописные, а может быть такое лишь с
некоторыми знаками.
Если ни один из следующих диапазонов не использован широко и часто,
то, возможно, документ не Кириллический. При разборе предполагается,
что рассматреваемый документ был написан с выключенным переключателем
на прописные буквы.
Характерные распределения частотности
- Windows-1251
- Первый используемый диапазон 0E0h─0FFh, второй находится на
диапазоне 0C0h─0DFh. Можно спутать с КОИ-8 при письме прописными
буквами.
- IBM866 (Альтернативная модифицированая)
- Альтернативная
- Здесь диапазон строчных букв был распилен на две части через
диапазон с таблицами. Поэтому, наиболее частыми диапазонами
будут A0h─AFh и E0h─EFh. Второй диапазон находится на 80h─9Fh.
Частое использование таких кодов, как 0B3h, 0C4h, 0CDh, 0BAh,
0BBh, 0BCh, 0C8h, 0C9h, 0CEh и 0C4h, вместе с некоторыми другими
кодами из диапазона 0B0h─0DFh, но не так часто, может только
потвердить использование этой кодировки, и что документ содержит
таблицы.
- CP855
- Здесь символы расположены поочерёдно, то есть то прописной, то
строчный. Строчные буквы расположены на чётных позициях в
диапазоне 0A0h─0ADh, 0C6h─OC7h, и 0D0h─0DEh, и на нечётных
позициях в диапазоне 0B5h─0BEh, 0E0h─0FCh. На остальных позициях
могут располагаться либо прописные буквы, либо другие знаки. Для
подробностей смотрите таблицу символов.
- MacCyrillic
- Основной диапазон находится в 0DFh─0FEh, а второй ─ на 80h─9Fh.
Остальной диапазон содержит много математики и национальных
символов.
- КОИ-8
- Основной диапазон здесь находится на 0C0h─0DFh, а второй ─ на
0E0h─0FFh. Можно спутать с Windows-1251 при письме прописными
буквами.
- ISO-8859-5
- Основная
- Основной диапазон находится на 0DOh─0EFh, второй ─ на 0B0h─0CFh.
- ДКОИ
- ...
Такой частотный разбор можно продолжать для любых кодировок. Здесь
были только некоторые из них.
Уточнение кодировки
Как ты видел выше, один частотный диапазон может совпадать у разных
кодировок. Неправильный выбор может привести как к неправильному
отображению некоторых букв, так и всей Кириллицы ─ если говорим о
КОИ. Тогда нужна проверка более специфичных вещей, такие как частота
или характер появления отдельных байт.
- ISO-8859-5 и Основная кодировка
- Первая кодировка определяет управляющие символы У1 (C1). В
вселенной гипертекста управляющие символы совершенно бесполезны.
А значит, не будет встречаться байт из диапазона 80h─9Fh.
Если они встречаются, и происходит это не один раз, то это ─
Основная кодировка, а в противном случае ─ ISO-8859-5.
Убедиться снова можно, посмотрев на характер появления байта
0F0h. Если рядом с ним, на расстояний не более 2 байта,
всречаются пробелы, цифры, 0A0h, то это знак номера, а
кодировка ─ ISO-8859-5. Если рядом с ним встречаются
предполагаемые строчные буквы, то это ─ пусть и случается очень
редко ─ заглавная буква «Ё», а кодировка ─ Основная.
- Windows-1251 и КОИ-8
- Как известно, самые встречаемые буквы на Руси ─ «О»,
«Е», «А», «И». В этих
кодировках знаки расставлены по разному, и, поэтому, если сам
текст вполне нормальный, их можно разобрать по самым частым
байтам, представляющих самые частые буквы.
Также, версия КОИ-8 для Всемирной паутины позволяет изображать
таблицы, в то время как Windows-1251 предусматривает другие
знаки. Значит, если нет часто используемых конкретных знаков
оттуда (080h─09Fh), то это, возможно, Windows-1251.
- Альтернативная модифицированая и Альтернативная кодировка
- Эти кодировки почти не отличаются друг от друга. Поэтому лучше
предполагать, что документ использует кодировку Альтернативную
модифицированую, которая в мире встречается чаще, а на противный
случай предоставлять возможность переключить кодировку.
И для других кодировок тоже самое.