Это статья о том, что помогает нам выводить буквы на экран почти во всех компьютерах и смартфонах мира. Чисто для кругозора и понимания мира информационных технологий.
7-битная кодировка: первая таблица символов
Так-то компьютеры понятия не имеют про буквы и цифры. Они знают только единицы и нули.
Чтобы компьютер мог вывести на экран буквы, цифры и другие символы, ему их нужно две вещи:
- Знать, как эти символы выглядят, — какие пиксели зажигать, какие нет.
- Знать, какой символ какому коду соответствует, — чтобы выводить нужные символы.
Когда компьютеры только появлялись, для решения этой задачи придумали таблицу символов: в ней хранились рисунки символов и их код. Компьютер получал команды «выведи символ номер такой-то», он находит такой-то номер, запоминал рисунок символа, выводил его на экран и повторял это быстро-быстро, чтобы символов на экране было много.
В 1960-х годах, когда персональные компьютеры только появляться в США, в таблицах была только латиница и математические символы. Ещё были управляющие коды — они сообщали компьютеру, что делать с данными дальше. Всего таких символов набралось 127, а такая таблица называлась ASCII (Американский стандарт представления информации):
Каждый символ в этой таблице можно закодировать в семи битах (нолях и единицах), что в сумме давало 2⁷ = 128 символов:
000 0000 ← самый первый символ в таблице
…
111 1111 ← последний символ в таблице
Например, если считать с нуля, то заглавная буква A стоит на 65-м месте в таблице. Число 65 в десятичной системе — это 1000001 в двоичной, и это занимает как раз 7 бит.
Проблема этой таблицы в том, что с ней не получится закодировать русский текст — в таблице ASCII нет русских букв. И болгарский тоже не получится, как и китайский, арабский и прочие языки, где есть свои начертания букв.
8-битная кодировка: добавляются национальные символы
Чтобы компьютер мог выводить символы из других языков, семибитную таблицу кодировки расширили до восьмибитной. Это значит, что каждый символ в ней кодировался уже восемью битами, а в таблице могло поместиться 2⁸ = 256 символов.
В СССР такой восьмибитной таблицей стала КОИ-8 — в ней добавились символы русского алфавита и элементы псевдографики. В международном формате эта кодировка известна как KOI8-R. Для сохранения обратной совместимости первые 128 символов совпадают с кодировкой ASCII:
Хитрость этой кодировки в том, что если отбросить первый бит и превратить её в семибитную, то все почти все русские буквы превратятся в такие же латинские:
А → A
Б → B
Ц →C и так далее
Это было сделано для сохранения максимальной совместимости текстов: если его открыть на компьютере, где нет КОИ-8, то текст всё равно получится прочитать, пусть и на латинице. Это прямо хардкорная обратная совместимость, но тогда это было необходимо: памяти было мало.
Проблема символьных языков
Восьмибитная кодировка решила проблему многих языков: дополнительные 128 ячеек позволили разместить много национальных букв алфавита. Но осталась проблема с другими языками, где дополнительных символов нужно гораздо больше, например:
- китайский,
- корейский,
- японский,
- тамильский,
- язык чероки,
- эфиопский.
В итоге каждая страна с такой письменностью делала свои таблицы кодировок. Это неудобно для всех, у кого нет таких таблиц: при открытии файла получался бессмысленный набор символов из той кодировки, что была под рукой.
Интернетные байки
В конце девяностых и начале двухтысячных в русскоязычном интернете была проблема с кодировками русских символов. В ходу было несколько восьмибитных кодировок: KOI-8R, Windows 1251 и ещё отдельная для MacOS. На главных страницах сайтов можно было прямо выбрать, в какой вам кодировке отобразить сайт. Не все браузеры поддерживали все эти кодировки, приходилось выкручиваться. Админы делали разные версии сайтов в разной кодировке — буквально клали на сервер разные файлы для разных кодировок.
По мере распространения компьютеров с Windows сайты стали делать в кодировке Win-1251, а потом все переползли на Юникод.
Юникод
Чтобы решить все проблемы с кодировками во всех странах, придумали Unicode — это сокращение от слов universal code (универсальный код). Идея в том, чтобы собрать все кодировки в одном месте — это позволит прочитать любой текст в любой стране, набранный на любом языке мира.
В Юникоде можно закодировать 1 112 064 символов — букв, знаков, иерогрифов, эмодзи, пиктограмм, глифов и других элементов письменности. Сейчас в Юникоде занято примерно 150 тысяч символов, но этого уже достаточно, чтобы охватить почти всю письменность мира. И, соответственно, ещё миллион символов ждёт, когда мы их придумаем.
Все современные операционные системы поддерживают Юникод, поэтому сейчас мы можем спокойно открыть любые файлы с китайскими иероглифами или арабской вязью.
Вот несколько примеров таблиц с разными символами Юникода. Числа под каждым символом — это порядковый номер символа в общей таблице.
Принципы Юникода
Гарантии стабильности — каждый символ всегда остаётся на своём месте. Даже если несколько лет спустя выяснится, что в таблицу забыли добавить важный для языка символ, он появится не рядом со своим языком, а на новой пустой позиции. Чтобы сгруппировать элементы языка в одном месте, используют национальные порядки сортировки, а не меняют записи в таблице. Это значит, что каждая новая версия Юникода полностью обратно совместима со всеми предыдущими.
Динамическая компоновка. Многие символы в Юникоде получаются соединением двух других, например A + ¨ = Ä. Есть исключения, но на общем фоне их немного.
Без оформления. Задача Юникода — передать смысл текста, а не его внешний вид. Это значит, что в кодировке нет правил оформления или выделения слов цветом.
Юникод кодирует простой текст без оформления. Считается, что простой текст должен хранить достаточно данных, чтобы читаемо отобразить его, и больше ничего.
Что не входит в Юникод
Кажется, что в Юникоде достаточно места, чтобы не фильтровать символы, а добавлять всё подряд. Но на деле есть свои ограничения:
- малоизвестная письменность, про которую пока мало данных;
- языки и письменности, где нет устоявшихся стандартов;
- нетекстовая письменность, например иератика и демотика — часть египетской клинописи (египетские иероглифы, кстати, в Юникоде есть).
Что дальше
В следующей части разберём, как символы Юникода кодируются и хранятся в виде наборов битов. Это не так просто, как кажется: нужно учесть технические ограничения при передаче данных и уметь переводить одни символы в другие.