Про кодировки и Юникод

Вначале стоит разъяснить пару терминов. Кодовая страница — таблица заранее известного размера, каждой позиции (или коду) которой сопоставлен единственный символ или его отсутствие. Например, кодовая страница размерностью 256, где 71-й позиции соответствует буква «G». Кодировка — правило кодирования символа в числовое представление. Любая кодировка создается для определенной кодовой страницы. Для примера, символ «G» в кодировке Абрвал примет значение 71. Кстати, простейшие кодировки так и поступают — представляют символы их значениями в кодовых таблицах, ASCII тоже к таким относится.

Раньше для кодирования хватало всего 7 бит на символ. А что? достаточно для 128 различных знаков, вмещалось все необходимое тогдашним пользователям: английский алфавит, знаки препинания, цифры и некоторых спецсимволы. Основная англоязычная 7-битная кодировка с соответствующей ей кодовой страницей получили название ASCII (American Standard Code for Information Interchange), они же заложили основы на будущее. Позже, когда компьютеры распространились в неанглоговорящие страны, появилась нужда в национальных языках, здесь-то фундамент ASCII и пригодился. Компьютеры обрабатывают информацию на уровне байтов, а код ASCII занимает только 7 первых бит. Использование 8-го расширяло пространство до 256 мест без потери совместимости, а вместе с ней и поддержки английского языка, это было важно. На этом факте выстроено большинство неанглоязычных кодовых страниц и кодировок: нижние 128 позиций как у ASCII, а верхние 128 отведены для национальных нужд и кодировались со старшим битом. Однако, создание для каждого языка (иногда группы схожих языков) собственной страницы и кодировки привело к возникновению проблем с поддержкой такого хозяйства разработчиками операционных систем и программного обеспечения в целом.

Для выхода из ситуации организовали консорциум, разработавший и предложивший стандарт Юникода. В нем предполагалось объединить знаки всех языков мира в одной большой таблице. Кроме того, определялись кодировки. Сначала ребята посчитали, что 65 535 посадочных мест должно хватить всем, ввели UCS-2 — кодировку с фиксированной 16-битной длиной кодов. Но пришли азиаты с многотомными азбуками, и расчеты рухнули. Кодовую область увеличили вдвое, UCS-2 уже не смогла бы справиться, появилась 32-битная UCS-4. Ощутимыми преимуществами кодировок UCS являлись постоянная кратная двум длина кодов и простейший алгоритм кодирования, и то, и другое способствовало скорости обработки текса компьютером. Но при этом была и неоправданная, чересчур расточительная трата места: представьте, что в ASCII 00010101, то в UCS-2 00000000 00010101, а UCS-4 уже 00000000 00000000 00000000 00010101. С этим нужно было что-то делать.

Развитие Юникода повернуло в сторону кодировок с переменной длиной получаемых кодов. Представителями стали UTF-8, UTF-16 и UTF-32, последняя условно-досрочно, так как на данный момент она идентична UCS-4. Каждый символ в UTF-8 занимает от 8 до 32 бит, причем есть совместимость с ASCII. В UTF-16 16 или 32 бита, UTF-32 — 32 бита (если бы пространство Юникода расширили еще вдвое, то уже 32 или 64 бита), с ASCII эти две не дружат. Количество занимаемых байтов, зависит от позиции символа в таблице Юникода. Очевидно, наиболее практичная кодировка — UTF-8. Именно благодаря своей совместимости с ASCII, небольшой прожорливости до памяти и достаточно простым правилам кодирования, она является наиболее распространенной и перспективной кодировкой Юникода. Ну, а в завершение красивая схема преобразования кода символа в UTF-8:

Share