Как опознать кодировку по встречаемости знаков

Для кириллицы существует более десяти различных кодировок. Документ может быть написан на любом из них. Каждая кодировка представляет свой способ кодирования текста, а значит, должен иметь своё характерное распределение частотности байт в документе.

Наиболее используемы строчные буквы, поэтому их байты будут наиболее встречаемы. Также, помимо них, используемы прописные буквы. Они будут упомянуты как второй диапазон. А другие знаки в сумме не будут встречаться так часто, как и прописные, а может быть такое лишь с некоторыми знаками.

Если ни один из следующих диапазонов не использован широко и часто, то, возможно, документ не Кириллический. При разборе предполагается, что рассматреваемый документ был написан с выключенным переключателем на прописные буквы.

Характерные распределения частотности

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.

Альтернативная модифицированая и Альтернативная кодировка
Эти кодировки почти не отличаются друг от друга. Поэтому лучше предполагать, что документ использует кодировку Альтернативную модифицированую, которая в мире встречается чаще, а на противный случай предоставлять возможность переключить кодировку.
И для других кодировок тоже самое.