Unicode и форматы его представления — HackZona.Ru

Unicode и форматы его представления

Unicode и форматы его представления

Тип статьи:
Со старой ХакЗоны.
Источник:
MBR
.:: Введение::.

В 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 комментария

22:07
История........
16:06
>История........
Первый абзац (: