Юникод

Материал из Википедии — свободной энциклопедии
Это старая версия этой страницы, сохранённая Alecv (обсуждение | вклад) в 20:56, 18 мая 2005. Она может серьёзно отличаться от текущей версии.
Перейти к навигации Перейти к поиску

Юникод (Unicode, (редк.) уникод, универсальная система кодирования) — стандарт кодировки знаков, позволяющий представить знаки практически всех письменных языков. Юникод имеет несколько форм представления, включая UTF-8, UTF-16 (UTF-16BE, UTF-16LE) и UTF-32 (UTF-32BE, UTF-32LE). Была разработана также форма представления UTF-7 для передачи по семибитным каналам, но из-за несовместимости с ASCII она не получила распространения и не включена в стандарт. В Microsoft Windows NT и основанных на ней системах Windows 2000 и Windows XP поддерживается форма UTF-16. В UNIX-подобных операционных системах GNU/Linux, BSD и Mac OS X принята форма UTF-8 для файлов и UTF-32 для обработки в оперативной памяти.

Стандарт предложен в 1991 году некоммерческой организацией «Unicode Consortium», объединяющей крупнейшие IT-корпорации. Ныне консорциум преобразован в «Unicode Corp.» Применение этого стандарта позволяет закодировать очень большое число символов из разных письменностей: в документах Unicode могут соседствовать китайские иероглифы, математические символы, буквы греческого алфавита и кириллицы, при этом становятся ненужными кодовые страницы.

Коды в стандарте Unicode разделены на несколько областей. Область с кодами от U+0000 до U+007F содержит символы набора ASCII с соответствующими кодами. Далее расположены области знаков различных письменностей, знаки пунктуации и технические символы. Часть кодов зарезервирована для использования в будущем. Под символы кириллицы выделены коды от U+0400 до U+052F.

Кодовое пространство

Хоть формы записи UTF-8 и UTF-32 позволяют кодировать до 231 (2 147 483 648) кодовых позиций, принято решение использовать лишь 220+216 (1 114 112) для совеместимости с UTF-16. Впрочем, даже и этого более чем достаточно — на сегодняшний день используется чуть больше 96 000 кодовых позиций.

Система кодирования

Универсальная система кодирования (Юникод) представляет собой набор графических символов и способ их кодирования для компьютерной обработки текстовых данных.

Графические символы — это символы, имеющие видимое изображение. Графическим символам противопоставляются управляющие символы и символы формата.

Графические символы включают в себя следующие группы:

  • буквы, содержащиеся хотя бы в одном из обслуживаемых алфавитов;
  • цифры;
  • знаки пунктуации;
  • специальные знаки (математические, технические, идеограммы и пр.);
  • разделители.

Юникод — это система для линейного представления текста. Символы, имеющие дополнительные надстрочные или подстрочные элементы, представляются в виде последовательности кодов, составленной по определённым правилам (декомпозированный вариант) или единого символа (композированный вариант).

Графические символы в Юникод подразделяются на протяжённые и непротяжённые (бесширинные). Непротяженные символы при отображении не занимают места в строке. К ним относятся ударения, диакритические знаки и т. п. При кодировании в Юникод как протяжённые, так и непротяжённые символы имеют собственные коды. Протяженные символы иначе называются базовыми, а непротяжённые — комбинируемыми, потому что они не могут встречаться самостоятельно. Например, символ «á» будет представлен как последовательность базового символа «a» (U+0061) и комбинируемого символа " ́ " (U+0301) или как отдельный символ «á» (U+00C1) .

Проблема 16-битных реализаций

Первая версия Юникода использовала 16-битные символы, т. е. общее число кодов было 216 (65536). При этом в Юникоде планировалось кодировать не все существующие символы, а только те, которые необходимы в повседневном обиходе. В дальнейшем, однако, было принято решение расширить кодовую область до 220+216 (1 114 112). Но поскольку многие компьютерные системы продолжали поддерживать только 16-битные символы, было решено всё наиболее важное кодировать только в пределах первых 65536 позиций (т. н. «basic multilingual plane»). Остальное было отведено для «экзотики» (например, систем письма вымерших языков или очень редко используемых китайских иероглифов).

Для улучшения совместимости со старыми 16-битными системами была изобретена система UTF-16, где первые 65536 позиций отображаются непосредственно как 16-битные числа, а остальные представляются в виде «суррогатных пар» (первый элемент пары из области U+D800…U+DBFF, второй элемент пары из области U+DC00…DFFF).

UTF-8

UTF-8 (Unicode Transformation Format) — это представление Юникода, обеспечивающее наилучшую совместимость со старыми системами, использовавшими 8-битные символы. Текст, состоящий только из символов с номером меньше 128, при записи в UTF-8 превращается в обычный текст ASCII. И наоборот, в тексте UTF-8 любой байт со значением меньше 128 изображает символ ASCII с тем же кодом. Остальные символы Юникода изображаются последовательностями длиной от 2 до 6 байтов (реально только до 4 байт, поскольку использование кодов больше 221 не планируется), в которых первый байт всегда имеет вид 11xxxxxx, а остальные — 10xxxxxx.

Символы UTF-8 получаются из Unicode следующим образом:

Unicode UTF-8
0x00000000 — 0x0000007F: 0xxxxxxx
0x00000080 — 0x000007FF: 110xxxxx 10xxxxxx
0x00000800 — 0x0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
0x00010000 — 0x001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
(теоретически возможны, но не включены в стандарт также:)
0x00200000 — 0x03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
0x04000000 — 0x7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

Обратите внимание, что хотя UTF-8 позволяет указать один и тот же символ несколькими способами, только наиболее короткий из них правильный. Остальные формы должны отвергаться по соображениям безопасности.

Порядок байтов

В эависимости от машинного порядка байтов, в потоке данных UTF-16 старший байт может записываться либо перед младшим (UTF-16BE), либо после младшего (UTF-16LE). Аналогично существует два варианта четырёхбайтной кодировки — UTF-32BE и UTF-32LE.

Для указания кодировки текста в Юникоде используется соглашение, по которому в начале текста записывается символ U+FEFF (неразрывный пробел с нулевой шириной), также именуемый BOM (Byte Order Mark). Поскольку символа U+FFFE не существует, это позволяет определить кодировку текста. Документы, следующие этой конвенции начинаются с такой последовательности байтов:

UTF-8
EF BB BF
UTF-16BE
FE FF
UTF-16LE
FF FE
UTF-32BE
00 00 FE FF
UTF-32LE
FF FE 00 00

К сожалению, эта мера не даёт возможности различать UTF-16LE и UTF-32LE, поскольку U+0000 является легальным символом.

Версии юникода

По мере изменения и пополнения таблицы символов системы Юникода и выхода новых версий этой системы — а эта работа ведётся постоянно, поскольку изначально система Юникод была представлена в ISO в недоработанном виде — выходят и новые документы ISO. Система Юникод существует в общей сложности в следующих версиях:

  • 1.1 (соответствует стандарту ISO/IEC 10646—1: 1993),
  • 2.0, 2.1 (тот же стандарт ISO/IEC 10646—1: 1993 плюс дополнения: «Amendments» с 1-го по 7-е и «Technical Corrigenda» 1 и 2),
  • 3.0 (стандарт ISO/IEC 10646—1:2000).
  • 3.2 (стандарт 2002 года)
  • 4.0 (стандарт 2003)
  • 4.01 (стандарт 2004)
  • 4.1 (стандарт 2005)

Двунаправленное письмо

Стандарт Юникод поддерживает языки как с направлением написание справа-налево (RTL) так и с написанием слева-направо (LTR) (иврит, арабский). Кроме того, Юникод поддерживает комбинированные тексты, содержащие одновременно RTL и LTR фразы. Данная возможность называется Bidir. Простые реализации Юникода могут не иметь поддержки Bidir.

Проблемы Юникода

Как любая система, Юникод не свободен от недостатков.

  • Многие системы письма всё ещё не представлены в Юникоде. Например, письменность церковнославянского языка содержит много дополнительных графических элементов (такие как титлы и надстрочные буквы). Они не могут быть должным образом представлены в системе Юникод, хотя отдельные элементы для этого имеются.
  • Тексты на китайском, корейском и японском языке имеют традиционное написание сверху вниз, начиная с правого верхнего угла. Данная возможность не отражена в Юникоде. Хотя направление текста Справа-Налево и Слева-Направо поддерживается, направление Сверху-Вних не поддерживается. (впрочем, она и не должна быть отражена, поскольку это относится к форматированию текста, а не к кодированию символов).
  • В стандартах Юникода не было зафиксировано, когда вводится отдельная кодовая позиция для готового (Precomposed) символа, а когда его необходимо набирать из базового и диакритического. Например, русские буквы Ё (U+0401) и Й (U+0419) существуют в виде отдельных символов, хотя могут быть представлены и набором базового символа плюс диакритика (Decomposed): Ё (U+0415 U+0308), Й (U+0418 U+0306). В то же время множество символов из языков с алфавитами на основе кириллицы не имеют базовых форм.
  • Юникод предусматривает возможность разных начертаний одного и того же символа в зависимости от языка. Так, китайские иероглифы могут иметь разные начертания в китайском, японском (кандзи) и корейском (ханджа), но при этом в Юникоде обозначаться одним и тем же символом (так называемая CJK-унификация), хотя упрощённые и полные иероглифы всё же имеют разные коды. Часто возникают накладки, когда, например, японский текст выглядит «по-китайски». Аналогично, русский и сербский языки используют разное начертание курсивных букв п и т (в сербском они выглядят как и и ш). Поэтому нужно следить, чтобы текст всегда был правильно помечен как относящийся к тому или другому языку.
  • Юникод широко использует комбинируемые диакритические символы, которые всё ещё плохо поддерживаются многими компьютерными системами (проблемы реализации).

«Юникод» или «Уникод»?

В русском языке слова с латинским элементом «uni-» традиционно писались через «уни-» (универсальный, униполярный, унификация, униформа). Однако для слова Unicode распространилось написание «Юникод» (видимо, изобретённое в компании Майкрософт при создании русской версии Windows 95). С пуристической же точки зрения предпочтительнее использовать написание «Уникод», так как в русском языке уже есть морфемы «уни-» и «код».  До сих пор написание «юни-» использовалось только для собственных имён, заимствованных из английского языка (напр., «Юнилевер»). «Unicode» — международный термин, никак не привязанный к английскому языку, однако написание «Юникод» уже твёрдо вошло в русскоязычные тексты. Согласно Яндексу частота использования слова «Юникод» в 3,5 раза превышает «Уникод», поэтому в Википедии используется наиболее широко распространённый вариант.

Ссылки

См. также