Проблема многих языков заключается в том, что для них существует несколько альтернативных кодировок символов. Например, для кириллицы существуют такие кодировки, как CP-866, KOI8-R, CP-1251, ISO-8859-5, кодовая страница Macintosh и другие, но вместе с тем не существует единого стандарта, принятого де-факто. В итоге, для того, чтобы быть уверенным, что документ будет прочтен, его нужно представлять в трех или четырех кодировках, что очень неудобно.
Для того чтобы решить эти и некоторые другие проблемы, был создан стандарт Unicode. Unicode присваивает уникальный код любому символу, независимо от платформы, независимо от программы, независимо от языка. Символам кириллицы Unicode присваивает коды в диапазоне от #x400
до #x4ff
. Таблица кодов для кириллицы может быть найдена в формате PDF на Web-сайте Unicode:
http://www.unicode.org/charts/PDF/U0400.pdf.
Использование Unicode
Для описания символов сотен языков всего мира, а также других символьных обозначений (например, математических символов) Unicode позволяет использовать три формы кодирования — UTF-8, UTF-16 и UTF-32.
В UTF-8 символы разных диапазонов кодируются последовательностями, состоящими из разного количества байт в соответствии со следующими правилами.
□ Символы с кодами в интервале #x0
–#x7F
кодируются одним байтом, первый бит которого равен нулю.
□ Для остальных символов число байт определяется количеством ведущих единиц первого байта последовательности.
□ Два первые бита каждого последующего байта равны единице и нулю соответственно.
□ Все остальные биты используются для кодирования символа.
В табл. 1.2 для каждого интервала символов показано количество байт, нужных для кодирования символа, форма кодирования и количество бит, доступных для кода.
Таблица 1.2. Формы кодирования символов в UTF-8
Диапазон | Кол-во байт | Форма кодирования | Кол-во бит |
---|---|---|---|
#x0-#x7F |
1 | 0xxxxxxx | 7 |
#x80-#x7FF |
2 | 110xxxxx 10xxxxxx | 11 |
#x800-#xFFFF |
3 | 1110xxxx 10xxxxxx 10xxxxxx | 16 |
#x10000- #x1FFFFF |
4 | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx | 21 |
К примеру, символу "Э
" (заглавной русской букве "Э
") Unicode присваивает код #x42D
или 10000101101
в двоичном представлении. Это значение входит в интервал #x80-#x7ff
, значит, для кодирования нужно использовать двух-байтовую форму вида 110xxxxx 10xxxxxx
, где символы "x
" обозначают 11 бит, доступных для кодировки. Таким образом, данному символу будет соответствовать следующий двоичный код:
11010000 10101101
или #xD0AD
в шестнадцатеричном представлении.
Полужирным шрифтом выделены управляющие биты UTF-8 (110
означает, что символ закодирован двухбайтной последовательностью, 10
определяет второй байт последовательности), курсивом — биты кода символа.
Удобство UTF-8 заключается в том, что кодировка первых 127 символов совпадает с широко распространенной 7-битной кодировкой ASCII. Это делает возможным использование уже существующего программного обеспечения для обработки текста в UTF-8, например текстовых редакторов.
Для записи наиболее часто используемых символов с кодами, меньшими #xFFFF
, UTF-16 использует двухбайтные последовательности, в которых каждый бит соответствует биту кода. Помимо этого, в UTF-16 могут быть также представлены символы с кодами в диапазоне #10000-#FFFFF
. Для кодирования этих символов в UTF-16 применяются пары 16-битных значений в интервале #xD800-#xDFFF
(ранее зарезервированные Unicode), называемые суррогатными парами (surrogate pairs). Младшие 10 бит каждого значения отводятся на кодировку символа, что в итоге дает 20 бит, достаточных для записи любого кода, не превышающего #xFFFFF
(табл. 1.3).
Таблица 1.3. Формы кодирования символов в UTF-16
Диапазон | Кол-во байт | Форма кодирования | Кол-во бит |
---|---|---|---|
#x0-#xD7FF |
2 | xxxxxxxx xxxxxxxx |
16 |
#xD800-#xDFFF |
Зарезервированы | ||
#xE000-#xFFFF |
2 | xxxxxxxx xxxxxxxx |
16 |
#x10000-#xFFFFF |
4 | 110110xxxxxxxxxx 110110xxxxxxxxxx |
20 |
Символ "Э
" с кодом #x42D
будет записан в UTF-16 в виде последовательности из двух байт — #x042D
.
Для символа с кодом #x153DC
(в двоичном представлении — 10101001111011100
) понадобится 4 байта. Он будет записан в виде
1101100001010100 1101101111011100
или #xD854DBDC
в шестнадцатеричном исчислении.
Полужирным шрифтом выделены управляющие биты UTF-16, курсивом — биты кода символа.
UTF-32 является самой простой формой кодирования — для каждого символа, вне зависимости от диапазона, используются 4 байта. Такой способ, несомненно, не является самым экономичным с точки зрения объема хранимой информации, но во многих случаях предоставляет определенные преимущества при обработке текста, так как символы не нужно декодировать.
Коды некоторых символов Unicode
В таблицах символов Unicode кодируются не только символы и знаки различных языков, но также и некоторые управляющие символы, например, неразрываемый пробел (no-break space), табуляция, перенос строки и так далее. Коды некоторых из этих символов, часто использующихся в XML-технологиях, мы приводим в табл. 1.4.
Таблица 1.4. Unicode-коды некоторых символов
Код | Обозначение | Описание |
---|---|---|
#х9 |
[НТ] |
Горизонтальная табуляция (horizontal tabulation) |
#xA |
[LF] |
Перевод строки (line feed) |
#xD |
[CR] |
Возврат каретки (carriage return) |
#x20 |
[SP] |
Пробел (space) |
#x21 |
! |
Восклицательный знак (exclamation sign) |
#x22 |
" |
Двойные кавычки (quotation mark) |
#x26 |
& |
Амперсант (ampersand) |
#x27 |
' |
Апостроф или одинарные кавычки (apostrophe) |
#x3C |
< |
Знак "меньше" или левая угловая скобка (less-than sign) |
#x3F |
? |
Вопросительный знак (question mark) |
#xA0 |
[NBSP] |
Неразрываемый пробел (no-break space) |