Перекодировать текст из CP866 ↓
Тот, кто застал компьютеры начала 1990-х годов, хорошо помнит синие панели Norton Commander, рамки из двойных линий и меню, нарисованные прямо в текстовом режиме. Все эти окна и таблицы строились не из графики, а из особых символов, и русские буквы на том же экране соседствовали с ними в одной и той же кодировке. Называлась она CP866, или кодовая страница 866, а в обиходе её чаще именовали "альтернативной кодировкой" или просто "досовской".
Основой для неё послужила американская кодовая страница 437, с которой поставлялись первые персональные компьютеры IBM. В ней нижняя половина таблицы совпадала с ASCII, а верхняя содержала западноевропейские буквы, греческие символы для математических формул и большой набор псевдографики. Советские и затем российские программисты решили сохранить псевдографику на прежних местах, поскольку без неё переставали правильно выглядеть все популярные программы. Русские буквы разместили в освободившихся позициях, убрав западноевропейские символы.
Из-за этого алфавит в CP866 оказался разорван на две части. Заглавные буквы от "А" до "Я" и строчные от "а" до "п" идут подряд в позициях с 128 по 175. Затем следуют три ряда символов псевдографики, и только после них, начиная с позиции 224, продолжаются строчные буквы от "р" до "я". Буквы "Ё" и "ё" стоят ещё дальше, сразу за алфавитом. Последние позиции таблицы заняты значками градуса, квадратного корня, знаком номера и другими полезными символами.
Такое устройство выглядит неудобным, но у него был серьёзный практический смысл. Символы для рисования рамок остались ровно там, где их ожидали программы, написанные для американской таблицы. Благодаря этому файловые менеджеры, текстовые редакторы и игры можно было русифицировать без переписывания интерфейса: менялся только шрифт в видеоадаптере, а линии, углы и тени по-прежнему складывались в аккуратные окна. Именно этим альтернативная кодировка выгодно отличалась от ГОСТовской основной кодировки, которая затирала псевдографику и потому не прижилась.
Появление Windows поставило пользователей перед новой проблемой. Microsoft выбрала для графической системы другую таблицу, Windows-1251, а программы для DOS продолжали работать в CP866. На одном компьютере одновременно существовали две кириллические кодировки, и текст, созданный в одной среде, превращался в бессмыслицу в другой. Слово "Привет", записанное в CP866 и открытое как Windows-1251, выглядит как "ЏаЁўҐв". В обратную сторону получается набор рамок и линий: "╧ЁштхЄ".
Особенно часто с этим сталкивались те, кто работал с командной строкой Windows. Консоль в русской версии системы по умолчанию использует именно кодовую страницу 866, тогда как графические программы работают в Windows-1251 или в Юникоде. Поэтому сообщения консольных утилит, перенаправленные в файл и открытые в Блокноте, нередко превращаются в нечитаемые символы, а русские имена файлов в старых пакетных сценариях отображаются неправильно. Команда chcp, меняющая кодовую страницу консоли, хорошо знакома многим администраторам именно по этой причине.
С кодировкой связано и ещё одно наследство. Архивы ZIP долгое время записывали имена файлов в той кодовой странице, которая использовалась в DOS, и для русскоязычных пользователей это была CP866. Если такой архив открыть программой, которая ожидает другую кодировку, вместо русских названий файлов появятся случайные значки псевдографики и греческие буквы. Подобная путаница встречается до сих пор при обмене архивами между Windows, Linux и macOS.
Сегодня CP866 используется в основном там, где требуется совместимость с прошлым. Её можно встретить в старых базах данных формата DBF, в отчётах учётных программ, созданных ещё для DOS, в выводе консольных утилит, в документации и текстовых файлах 1990-х годов. Для новых проектов она давно не применяется, поскольку все современные системы работают в UTF-8 или UTF-16.
Распознать текст в CP866 обычно несложно. Если русские слова в файле превратились в смесь заглавных кириллических букв с символами вроде "Ё", "ў" и "Ґ", а при обратной ошибке появляются уголки и линии псевдографики, почти наверняка перед вами альтернативная кодировка. Укажите CP866 в качестве исходной кодировки и преобразуйте текст в UTF-8, и он снова станет читаемым.