Работая с Интернетом и электронной почтой, многие из вас наверняка не раз сталкивались с проблемой выбора кодировки для букв русского алфавита. Но что стоит за всеми этими малопонятными названиями типа cp866, koi-8r, UTF-8 или ISO 8859-5? И как вообще представляются символы в компьютере?
Прародитель
Для компьютерного представления текста необходимо каждому знаку присвоить некоторое число – его код. Все современные таблицы кодировок происходят от возникшей еще в 60-е годы 7-разрядной таблицы ASCII (American Standard Code for Information Interchange), которая содержит 33 кода команд или управляющих символов, большая часть которых сегодня не используется, и 95 кодов для различных знаков, достаточных для работы с английскими текстами. При 7-разрядном кодировании каждому символу сопоставляется 7 бит кода, т. е. число в диапазоне от 0 до 127. В простых текстовых (plain text) файлах допустимы только управляющие символы, отмечающие концы строк и переходы на позиции табуляции. Скажем, маркер конца строки в Linux — это код 10, в Macintosh OS — 13, в CP/M, DOS и Microsoft Windows — последовательность кодов 13, 10.
Для аналогичного представления знаков русского алфавита ныне применяется таблица КОИ-7 (Код для обмена информацией 7-битный): это та же ASCII, но в которой вместо строчных латинских букв и шести других символов размещены заглавные буквы кириллицы, а вместо заглавных — строчные. У такого кодирования есть два важных преимущества: оно компактно (для доступа к латинским и другим буквам и возврата обратно к кириллице используются специальные управляющие коды), и оно вводит естественную транслитерацию, что позволяет работать с текстами на русском единообразно на разных компьютерных системах.
ASCII-коды все еще достаточно широко используются для текстов на английском, особенно в США, а также в системах e-mail. Стандартные текстовые утилиты UNIX (grep, sed, awk) вплоть до середины 90-х по умолчанию могли работать только с ASCII — подключение 8-го бита требовало их перекомпиляции. Сегодня 7-битная кириллица встречается, пожалуй, только в системе для подготовки научных публикаций TEX, да и то неявно, а для кодирования символов алфавитов большинства языков используется 8-разрядное кодирование, т. е. кодирование, при котором каждому символу сопоставляется 8 бит или 1 байт кода. Код представляет собой число в диапазоне от 0 до 255, а первые 128 символов при таком кодировании аналогичны ASCII.
Потомок
Международный стандарт ISO/IEC 8859-1 стал в наши дни де-факто заменой для ASCII. В нем первые 32 кода, числа 128–159, соответствуют практически неиспользуемым управляющим символам, общим для всех таблиц кодировки ISO. Хотя 8859-1 может использоваться для текстов почти на всех западноевропейских языках, он не полностью покрывает нужды французского и финского. Этот недостаток, а также отсутствие знака для новой общеевропейской валюты привели в 1999 г. к возникновению кодировки 8859-15, в которой изменены значения восьми кодов 8859-1, в частности, установлено 164 (A4) — ? (20ac в UCS).
Всего в ISO 8859 определяются четырнадцать 8-битовых таблиц кодировки, например, 8859-6 содержит набор арабских букв, 8859-7 — греческих, а 8859-8 — иврита.
Сводный брат
Ясно, что для кодирования символов некоторых языков, например, китайского, 8-разрядных чисел недостаточно. Кроме того, создание 8-разрядных таблиц кодировки в какой-то момент стало практически неконтролируемым: каждый новый компьютерный шрифт вводил и собственную таблицу. Именно поэтому был создан консорциум Unicode: его целью стала разработка единой системы кодирования всех возможных символов, что позволило присваивать коды знакам компьютерных шрифтов по определенной схеме, а не как бог на душу положит.
Кодировка Unicode опирается на каталог символов UCS (Universal Character Set) стандарта ISO 10646. UCS может содержать до 231=2147483648 различных знаков и постоянно пополняется. Коды UCS-2 — 2-байтные, т. е. числа от 0 до 65535, а UCS-4 — 4-байтные, т. е. числа от 0 до 2147483647. ASCII — это первые коды UCS-2, а UCS-2 — это начало UCS-4. Двух и четырехбайтные коды Unicode могут представляться двумя способами: байты располагаются слева направо от старшего к младшему (Big Endian, BE) или от младшего к старшему (Little Endian, LE). Второй способ встречается в подавляющем большинстве случаев. Кроме того, для более компактного кодирования используются коды переменной длины UTF-8 (Unicode Transfer Format) — 1–6-байтные и UTF-16 — 2- или 4-байтные. Последние также существуют в двух видах (Little и Big Endian) и позволяют кодировать не более 220+216=1114112 знаков. Все коды UCS-2 являются также и кодами UTF-16. Есть еще формат UTF-7, который позволяет для большинства символов ASCII использовать 7-битные числа, — он обеспечивает доступ только к UCS-2. Коды Unicode 20 (пробел), A0 (неразрывный пробел) и AD (перенос), присутствующие во многих 8-разрядных таблицах, можно рассматривать как управляющие.
Часть кодов в UCS зарезервированы для личного или ограниченного локальными рамками использования. Остальные коды также сгруппированы по назначению, например, кириллице выделен диапазон 400–4FF16.
Все большее распространение в Интернете получает кодировка UTF-8, которая позволяет обходиться 8 битами для кодирования символов ASCII и 16 битами для кодирования символов большинства алфавитных письменностей, в т.ч. русской. Тексты в ASCII, в частности, на английском языке являются одновременно и текстами в UTF-8. Код UTF-8, последовательность байт, получается из кода каталога UCS по следующей однозначной схеме:
|
|
|
00000000–0000007F16 (0–127): |
|
0xxxxxxx |
|
|
|
|
|
00000080–000007FF16 (128–2047): |
|
|
110xxxxx 10xxxxxx |
|
|
|
|
|
00000800–0000FFFF16 (2048–65535): |
|
|
1110xxxx 10xxxxxx 10xxxxxx |
|
|
|
|
|
00010000–001FFFFF16 (65536–2097151): |
|
|
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx |
|
|
|
|
|
00200000–03FFFFFF16 (2097152–67108863): |
|
|
111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx |
|
|
|
|
|
04000000–7FFFFFFF16 (67108864–2147483647): |
|
|
1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx. |
|
|
|
|
Позиции битов, обозначенные как буква x, заполняются соответствующими битами из кода символа в бинарном представлении. Используется кратчайшая из возможных многобайтовых последовательностей, которые могут представить код символа. Например, символ Unicode с кодом 169 = a916 = 1010 1001 (знак ©) кодируется в UTF-8 как 11000010 10101001 = c216 a916, а символ с кодом 8800 = 226016 = 0010 0010 0110 0000 (знак
) кодируется так: 11100010 10001001 10100000 = e216 8916 a016.
Unicode достаточно полно поддерживается современными программами – браузерами, офисными пакетами и т. п. В Linux используется UTF-8, а в Microsoft Windows еще и UCS-2. Пока поддержка UCS в Linux несколько слабее, чем в Microsoft Windows 2000/Me/XP. Главные проблемы при использовании Unicode — отсутствие соответствующего полного набора шрифтов и сложность ввода. Как, скажем, российскому пользователю вводить специфические испанские буквы, математические знаки, китайские иероглифы? Для этого приходится использовать те или иные программы – к примеру, может помочь текстовый редактор Yudit (www.yudit.org).
стр. 2>>