.:: Введение::.
В 1991 году «Консорциум Юникода» предложил новый стандарт кодирования символов. Теперь этот стандарт используется в интернациональных приложениях, способных работать на нескольких языках одновременно (например на арабском, русском и китайском). Соответственно, чтобы создавать подобные приложения, полезно знать особенности этого стандарта.
.:: Таблица кодирования Unicode::.
Ключевой концепцией Юникода является таблица кодирования символов. Она ставит в соответствие единственное натуральное число символу. Это число называется кодом символа.
.:: Представление данных Unicode::.
Естественно, одной таблицы для мультибайтовых символов недостаточно для полного описания стандарта. Одна и та же последовательность многобайтных символов может быть записана разными способами. В связи с этим существует несколько форматов преобразования Юникода: UTF-8, UTF-16 (UTF-16BE, UTF-16LE) и UTF-32 (UTF-32BE, UTF-32LE).
.::UTF-8::.
Представление символа в зависимости от его кода:
1. [0-128]. Стандартные ASCII-символы. Кодируются как обычно, т.е. одним байтом.
2. [129-2047]. Кодируются 11 битами, представленными в виде двух байт в формате 110xxxxx 10xxxxxx.
3. [2048-65535]. Кодируются 16 битами, представленными в виде трех байт в формате 1110xxxx 10xxxxxx 10xxxxxx.
4. [65536-2097151]. Кодируются 21 битами, представленными в виде четырех байт в формате 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
5. Остальной диапазон: не включен в стандарт
.::UTF-16::.
UTF-16 это способ кодирования символов «16-битными байтами». В этой системе все на первый взгляд кажется проще, чем в UTF-8:
1. [0-65535] — кодируются как есть.
2. [65535-1114110] — Кодируются в виде 16 бит; при этом первые 8 бит образуют число из диапазона (0xD8000xDFFF), а вторые — число из диапазона (0xDC000xDFFF).
Какой октет считать ведущим, старший или младший, зависит от архитектуры. В связи с этим UTF-16 делится на UTF-16BE и UTF-16LE. В x86 используется UTF-16LE.
Очевидный минус UTF-16 по сравнению с UTF-8: требуется полная поддержка Unicode. Если текст в UTF-8, содержащий символы только из стандартной таблицы ASCII возможно прочитать с помощью средств, не умеющих обрабатывать Unicode, то в случае UTF-16 этого сделать не получится.
.:: Определение представления Unicode::.
Поставим следующую задачу. Дан файл в кодировке Unicode. Нам нужно определить формат представления. Для этого вставим в начало файла символ 0xfeff*, и посмотрим теперь на его первые байты:
ef bb bf => UTF-8
fe ff => UTF-16BE
ff fe => UTF-16LE
00 00 fe ff => UTF-32BE
ff fe 00 00 => UTF-32LE
Эту задачу можно обобщить на любой буфер, не обязательно файл.
.::Unicode в различных ОС и некоторых языках программирования::.
Microsoft Windows использует UTF-16LE.
Unix-подобные системы (Linux, BSD, Mac OS X) используют, в основном, UTF-8.
Для работы с Unicode в PHP есть несколько расширений: iconv, gettext, mbstring.
В языке «С» есть встроенный тип wchar_t для работы со строками в UTF-16.
В Delphi есть типы WideChar и WideString.
В .NET обычно используется класс System.Text.Encoding
.:: Ресурсы::.
Сайт «Консорциума Unicode» =>
www.unicode.org
Описание UTF-8 =>
www.ietf.org/rfc/rfc2279.txt
Описание UTF-16 =>
www.ietf.org/rfc/rfc2781.txt
2 комментария
Первый абзац (: