Конвертер кодировок текста

CP437: кодировка первого IBM PC

Перекодировать текст из CP437 ↓

В 1981 году компания IBM выпустила персональный компьютер, который определил облик целой отрасли. Вместе с ним на свет появилась и таблица символов, зашитая прямо в микросхему видеоадаптера. Позже её назвали кодовой страницей 437, а в обиходе часто говорили "OEM-кодировка" или "набор символов IBM PC". Именно эти 256 знаков видели на экране миллионы пользователей DOS, и именно от них отталкивались создатели десятков национальных кодировок, включая русскую CP866.

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

Верхняя половина таблицы содержала западноевропейские буквы с диакритическими знаками, символы валют, греческие буквы для математических формул, знаки бесконечности, корня и интеграла. Но главным её украшением стала псевдографика: одинарные и двойные линии, углы, перекрестья, а также блоки разной плотности заливки. Из этих символов собирались рамки, окна, таблицы, полосы прокрутки и тени. Без них трудно представить Norton Commander, текстовые редакторы и игры эпохи DOS.

Набор европейских букв в CP437 оказался неполным. В нём были французские, немецкие, испанские и скандинавские символы, но не хватало многих заглавных букв с акцентами, а часть позиций заняли знаки, полезные скорее американским пользователям. Поэтому вскоре появилась кодовая страница 850, где часть псевдографики уступила место недостающим буквам. Для других стран создавались свои варианты: CP852 для Центральной Европы, CP737 для греческого и, конечно, CP866 для кириллицы, которая сохранила рамки на тех же местах.

С переходом на Windows возник разрыв, который ощущается до сих пор. Графическая система получила другие таблицы, известные как ANSI-кодировки, например Windows-1252 и Windows-1251, а в консоли и в файлах старых программ продолжали жить OEM-кодировки. Поэтому один и тот же байт мог означать в разных средах совершенно разные символы. Например, буква "é" в CP437 имеет код 130, и текст "Café", открытый как Windows-1252, превращается в "Caf‚" с нижней одинарной кавычкой вместо буквы.

Ещё нагляднее путаница проявляется в псевдографике. Рамка из двойных линий "╔═══╗", записанная в CP437 и прочитанная как Windows-1251, превращается в строку "ЙННН»", а в Windows-1252 выглядит как набор латинских букв с акцентами. Зато в CP866 те же самые байты отображаются правильно, поскольку русская альтернативная кодировка унаследовала псевдографику без изменений. Именно поэтому программы для DOS, рисовавшие рамки, работали и в американской, и в русской версии системы.

CP437 оставила заметный след и в культуре. На её символах выросло целое направление компьютерного искусства, так называемая ANSI- и ASCII-графика, которой украшали электронные доски объявлений и заставки программ. Файлы с расширением NFO, которыми сопровождали программы и релизы, до сих пор рассчитаны на эту кодировку и правильно выглядят только в ней. Многие современные терминалы и шрифты специально поддерживают набор символов IBM PC ради совместимости с такими произведениями.

Кроме того, CP437 долгое время была кодировкой по умолчанию для имён файлов в архивах ZIP. Спецификация формата прямо предписывала использовать её, если в архиве не указан признак UTF-8. Программы, следующие этому правилу, до сих пор показывают русские имена файлов из старых архивов как набор греческих букв и линий, если исходная кодировка была не CP437, а CP866.

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