Кодирование символов. Unicode

Уникод или Юникод (от англ. слова Unicode ) является стандартом кодирования знаков-символов. Он даёт возможность быть представленными в кодировке почти всем письменным языкам.

В конце 1980-х роль стандарта закрепилась за 8-битными символами. 8-битные кодировки были представлены разными модификациями, число которых постоянно росло. Главным образом, это было результатом активного расширения спектра используемых языков. Имело место и стремление разработчиков придумать кодировку, претендующую хотя бы на частичную универсальность.

В итоге возникла необходимость заниматься решением нескольких проблем:

  • проблемы индикации документов в некорректной кодировке. Решить её было можно, либо последовательно внедряя методы указания применяемой кодировки, либо вводя единую кодировку для всех;
  • проблемы ограниченности пакета символов, решаемую либо путём переключения шрифтов в документе, либо внедряя расширенную кодировку;
  • проблемы трансформирования кодировки из одной в другую, которую представлялось возможным решить либо используя промежуточное преобразование (третья кодировка), включающую символы разных кодировок, либо составляя таблицы перекодировки для каждых двух кодировок;
  • проблемы дублирования отдельных шрифтов. Традиционно каждая кодировка предполагала наличие своего шрифта, даже когда кодировки полностью или частично совпадали в наборе символов. В какой-то мере проблема решалась с помощью «больших» шрифтов, из которых затем выбирались символы, нужные для конкретной кодировки. Но для того, чтобы определить степень соответствия, требовалось создать единый реестр символов.

Таким образом, на повестке дня встал вопрос о необходимости создания «широкой» единой кодировки. Используемые в Юго-восточной Азии кодировки с меняющейся длиной символа выглядели чересчур сложными в применении. Поэтому упор был сделан на использование символа, имеющего фиксированную ширину. 32-битные символы казались слишком громоздкими и победу в итоге одержали 16-битные.

Стандарт в 1991 году предложила интернет-сообществу некоммерческая организация «Консорциум Юникода» . Его использование даёт возможность закодировать большое количество символов разных видов письменности. В Unicode-документах не тесно в плотном соседстве ни китайским иероглифам, ни математическим символам, ни кириллице, ни латинице. При этом кодовые страницы в процессе работы не требуют никаких переключений.

Состоит стандарт из двух главных разделов: универсального набора символов (англ. UCS) и семейства кодировок (в английской интерпретации - UTF). Универсальным набором символов задаётся однозначная пропорциональность кодам символов. Коды в этом случае представляют собой элементы кодовой сферы, являющиеся неотрицательными целыми числами. Функция семейства кодировок - определение машинного представления последовательности UCS-кодов.

В Юникод-стандарте коды градированы по нескольким областям. Ареал с кодами, начиная с U+0000 и заканчивая U+007F, - включает символы комплекта ASCII с необходимыми кодами. Дальше находятся области символов разных письменностей, символов технических, знаков пунктуации. Отдельную партию кодов хранят в резерве для будущего применения. Под кириллицу определены следующие области символов с кодами: U+0400 - U+052F, U+2DE0 - U+2DFF, U+A640 - U+A69F.

Значение данной кодировки в веб-пространстве неумолимо растёт. Доля сайтов, применяющих Юникод, составляла в начале 2010 года почти 50 процентов.

Ряд цифр и букв имеют внешне схожее начертание, малоразличимое при небольшом размере шрифта. Например, цифры "0", "1" и буквы "О", "l" (L). Это является серьёзной проблемой, особенно в тех случаях, когда необходимо строго однозначное прочтение символов. К примеру, при записи ручкой на листке бумаги или печати на принтере своего буквенно-цифрового пароля. Решением данной проблемы пришлось заниматься первым программистам и фонт-дизайнерам (в XX-м веке, в самом начале компьютерной эры). Давно уже, появились специальные контрастные шрифты, такие как Inconsolata, Consolas (системный в OS Windows), Anonymous Pro, Deja Vu Sans Mono и многие другие. Некоторые из них можно бесплатно скачать по ссылкам с сайтов их авторов-создателей и с профильных Интернет-ресурсов.
Смотреть пример:
http://www.levien.com/type/myfonts/inconsolata.html

Если допускается техническими условиями и проектным заданием, то вместо цифрового нуля, в HTML-код ставится "Ø" (latin capital letter O with stroke, с косым штрихом, из модификации латинского алфавита для скандинавских языков - норвежского и датского), приблизительно похожий, своим начертанием, на перечёркнутый пополам нолик. В текстовом редакторе - такой значок берётся, копируется из таблицы спецсимволов (Special Character), и вставляется в нужную позицию в строке. Данный лайфхак-приём будет полезен, если возникают сложности с поиском и установкой на девайс специального фонта. Этот совет позволит сэкономить время и не перепутать цифру "0" (zero) с буквой "О" не только на мониторе вашего ПК, но и на экранах других устройств, где может не оказаться нужного шрифта. Такая форма записи, традиционно, применяется при обозначении на листе бумаги смешанной, буквенно-цифровой информации, например, своего пароля, кода доступа. Примечательно, что даже есть шутливое выражение " ", подчёркивающее важность наличия этого элемента, наделяющего символ определённым смыслом и значением. Графический вид нуля в разных типах шрифтов - можно посмотреть и сравнить их изображение на картинках с помощью специализированного сервиса на странице сайта:
http://www.fileformat.info/info/unicode/char/0030/fontsupport.htm

Рисунок 2

При редактировании и правке текста, перечёркивание неправильно написанного или ненужного символа - производится большим косым крестиком (двумя крест-накрест перекрещивающимися диагональными штрихами равной длины). В текстовом редакторе это осуществляется средствами форматирования - сначала выделяется фрагмент, а затем в меню нажимается последовательность кнопок и вкладок (Format - Character - Font Effects - Strikethrough) для выбора из выпадающих списков необходимого эффекта. Зачёркивание одного или нескольких слов в строчке или в целом абзаце документа - делается с помощью горизонтальной одинарной или двойной линии, достаточной толщины.

Если нужно точно выяснить, что в тексте написано - буква или цифра, то можно, в режиме поиска на странице, задать нужный символ и убедиться, что он будет найден именно там.

Стандарт предложен в 1991 году некоммерческой организацией «Консорциум Юникода» (англ. Unicode Consortium, Unicode Inc.). Применение этого стандарта позволяет закодировать очень большое число символов из разных письменностей: в документах Unicode могут соседствовать китайские иероглифы, математические символы, буквы греческого алфавита, латиницы и кириллицы, при этом становится ненужным переключение кодовых страниц.

Стандарт состоит из двух основных разделов: универсальный набор символов (англ. UCS, universal character set) и семейство кодировок (англ. UTF, Unicode transformation format). Универсальный набор символов задаёт однозначное соответствие символов кодам - элементам кодового пространства, представляющим неотрицательные целые числа. Семейство кодировок определяет машинное представление последовательности кодов UCS.

Стандарт Unicode был разработан с целью создания единой кодировки символов всех современных и многих древних письменных языков. Каждый символ в этом стандарте кодируется 16 битами, что позволяет ему охватить несравненно большее количество символов, чем принятые ранее 8-битовые кодировки. Еще одним важным отличием Unicode от других систем кодировки является то, что он не только приписывает каждому символу уникальный код, но и определяет различные характеристики этого символа, например:

Тип символа (прописная буква, строчная буква, цифра, знак препинания и т.д.);

Атрибуты символа (отображение слева направо или справа налево, пробел, разрыв строки и т.д.);

Соответствующая прописная или строчная буква (для строчных и прописных букв соответственно);

Соответствующее числовое значение (для цифровых символов).

Весь диапазон кодов от 0 до FFFF разбит на несколько стандартных подмножеств, каждое из которых соответствует либо алфавиту какого-то языка, либо группе специальных символов, сходных по своим функциям. На приведенной ниже схеме содержится общий перечень подмножеств Unicode 3.0 (рисунок 2).

Рисунок 2

Стандарт Unicode является основой для хранения и текста во многих современных компьютерных системах. Однако, он не совместим с большинством Интернет-протоколов, поскольку его коды могут содержать любые байтовые значения, а протоколы обычно используют байты 00 - 1F и FE - FF в качестве служебных. Для достижения совместимости были разработаны несколько форматов преобразования Unicode (UTFs, Unicode Transformation Formats), из которых на сегодня наиболее распространенным является UTF-8. Этот формат определяет следующие правила преобразования каждого кода Unicode в набор байтов (от одного до трех), пригодных для транспортировки Интернет-протоколами.


Здесь x,y,z обозначают биты исходного кода, которые должны извлекаться, начиная с младшего, и заноситься в байты результата справа налево, пока не будут заполнены все указанные позиции.

Дальнейшее развитие стандарта Unicode связано с добавлением новых языковых плоскостей, т.е. символов в диапазонах 10000 - 1FFFF, 20000 - 2FFFF и т.д., куда предполагается включать кодировку для письменностей мертвых языков, не попавших в таблицу, приведенную выше. Для кодирования этих дополнительных символов был разработан новый формат UTF-16.

Таким образом, существует 4 основных способа кодировки байтами в формате Unicode:

UTF-8: 128 символов кодируются одним байтом (формат ASCII), 1920 символов кодируются 2-мя байтами ((Roman, Greek, Cyrillic, Coptic, Armenian, Hebrew, Arabic символы), 63488 символов кодируются 3-мя байтами (Китайский, японский и др.) Оставшиеся 2 147 418 112 символы (еще не использованы) могут быть закодированы 4, 5 или 6-ю байтами.

UCS-2: Каждый символ представлен 2-мя байтами. Данная кодировка включает лишь первые 65 535 символов из формата Unicode.

UTF-16:Является расширением UCS-2, включает 1 114 112 символов формата Unicode. Первые 65 535 символов представлены 2-мя байтами, остальные - 4-мя байтами.

USC-4: Каждый символ кодируется 4-мя байтами.

Для корректной работы данного сайта требуется JavaScript. Пожалуйста, включите поддержку JavaScript в настройках вашего обозревателя.

Таблица символов Юникода

Показать все
Диапазон: 0000-001F: Управляющие символы C0 0020-007F: Основная латиница 0080-009F: Управляющие символы C1 00A0-00FF: Дополнительные символы Latin-1 0100-017F: Расширенная латиница-A 0180-024F: Расширенная латиница-B 0250-02AF: Расширенный набор символов международного фонетического алфавита 02B0-02FF: Некомбинируемые протяжённые символы-модификаторы 0300-036F: Комбинируемые диакритические знаки 0370-03FF: Греческий и коптский алфавиты 0400-04FF: Кириллица 0500-052F: Дополнительные символы кириллицы 0530-058F: Армянский алфавит 0590-05FF: Иврит 0600-06FF: Арабское письмо 0700-074F: Сирийский алфавит 0750-077F: Дополнительные символы арабского письма 0780-07BF: Тана (мальдивское письмо) 07C0-07FF: Нко 0800-083F: Самаритянское письмо 0840-085F: Мандейский алфавит 08A0-08FF: Расширенный набор символов арабского письма-А 0900-097F: Деванагари 0980-09FF: Бенгальская 0A00-0A7F: Гурмукхи 0A80-0AFF: Гуджарати 0B00-0B7F: Ория 0B80-0BFF: Тамильская 0C00-0C7F: Телугу 0C80-0CFF: Каннада 0D00-0D7F: Малаялам 0D80-0DFF: Сингальская 0E00-0E7F: Тайская письменность 0E80-0EFF: Лаосская письменность 0F00-0FFF: Тибетская письменность 1000-109F: Мьянманская письменность 10A0-10FF: Грузинский алфавит 1100-11FF: Хангыль (корейская письменность) 1200-137F: Эфиопская слоговая письменность 1380-139F: Дополнительные символы эфиопской письменности 13A0-13FF: Письменность чероки 1400-167F: Канадское слоговое письмо 1680-169F: Огам 16A0-16FF: Руническая письменность 1700-171F: Тагальская (байбайин) 1720-173F: Хануноо 1740-175F: Бухид 1760-177F: Тагбанва 1780-17FF: Кхмерская письменность 1800-18AF: Старомонгольская письменность 18B0-18FF: Расширенный набор символов канадского слогового письма 1900-194F: Письменность лимбу 1950-197F: Письменность тай лэ 1980-19DF: Новый алфавит тай лы 19E0-19FF: Кхмерские символы 1A00-1A1F: Бугийская письменность (лонтара) 1A20-1AAF: Старый алфавит тай лы (Тай Тхам) 1B00-1B7F: Балийская письменность 1B80-1BBF: Сунданская письменность 1BC0-1BFF: Батакское письмо 1C00-1C4F: Письменность лепча (ронг) 1C50-1C7F: Письменность Ол Чики 1CD0-1CFF: Ведические символы 1D00-1D7F: Фонетические расширения 1D80-1DBF: Дополнительные фонетические расширения 1DC0-1DFF: Дополнительные комбинируемые диакритические знаки 1E00-1EFF: Дополнительная расширенная латиница 1F00-1FFF: Расширенный набор символов греческого алфавита 2000-206F: Знаки пунктуации 2070-209F: Надстрочные и подстрочные знаки 20A0-20CF: Символы валют 20D0-20FF: Комбинируемые диакритические знаки для символов 2100-214F: Буквоподобные символы 2150-218F: Числовые формы 2190-21FF: Стрелки 2200-22FF: Математические операторы 2300-23FF: Разнообразные технические символы 2400-243F: Значки управляющих кодов 2440-245F: Символы оптического распознавания 2460-24FF: Вложенные буквы и цифры 2500-257F: Символы для рисования рамок 2580-259F: Символы заполнения 25A0-25FF: Геометрические фигуры 2600-26FF: Разнообразные символы 2700-27BF: Дингбаты 27C0-27EF: Разнообразные математические символы-A 27F0-27FF: Дополнительные стрелки-A 2800-28FF: Азбука Брайля 2900-297F: Дополнительные стрелки-B 2980-29FF: Разнообразные математические символы-B 2A00-2AFF: Дополнительные математические операторы 2B00-2BFF: Разнообразные символы и стрелки 2C00-2C5F: Глаголица 1AB0-1AFF: Комбинированные диакритические знаки (расширение A) 1CC0-1CCF: Расширенный набор символов сунданского письма A9E0-A9FF: Мьянманская письменность (расширение B) AAE0-AAFF: Расширенный набор символов письменности мейтей AB30-AB8F: Расширенная латиница-E AB30-AB6F: Варанг-кшити AB90-ABBF: Письменность Бериа для языка загхава 2C60-2C7F: Расширенная латиница-C 2C80-2CFF: Коптский алфавит 2D00-2D2F: Дополнительные символы грузинского алфавита 2D30-2D7F: Тифинаг 2D80-2DDF: Расширенный набор символов эфиопского письма 2DE0-2DFF: Расширенная кириллица-A 2E00-2E7F: Дополнительные знаки пунктуации 2E80-2EFF: Дополнительные иероглифические ключи ККЯ 2F00-2FDF: Иероглифические ключи словаря Канси 2FF0-2FFF: Символы описания иероглифов 3000-303F: Символы и пунктуация ККЯ 3040-309F: Хирагана 30A0-30FF: Катакана 3100-312F: Чжуинь (бопомофо) 3130-318F: Чамо, комбинируемое с хангылем 3190-319F: Знаки, используемые в камбуне 31A0-31BF: Расширенный набор символов бопомофо 31C0-31EF: Черты ККЯ 31F0-31FF: Фонетические расширения катаканы 3200-32FF: Вложенные буквы и месяцы ККЯ 3300-33FF: Знаки совместимости ККЯ 3400-4DBF: Унифицированные иероглифы ККЯ (расширение А) 4DC0-4DFF: Гексаграммы И-Цзин 4E00-9FFF: Унифицированные иероглифы ККЯ A000-A48F: Слоги и A490-A4CF: Радикалы и A4D0-A4FF: Алфавит лису A500-A63F: Слоговая письменность ваи A640-A69F: Расширенная кириллица-B A6A0-A6FF: Письменность бамум A700-A71F: Символы изменения тона A720-A7FF: Расширенная латиница-D A800-A82F: Силоти Нагри A830-A83F: Индийские числовые символы A840-A87F: Квадратное письмо Пагба-ламы A880-A8DF: Саураштра A8E0-A8FF: Расширенный набор символов деванагари A900-A92F: Кайях Ли A930-A95F: Реджанг A960-A97F: Хангыль (расширение A) A980-A9DF: Яванская письменность AA00-AA5F: Тямское письмо AA60-AA7F: Мьянманская письменность (расширение A) AA80-AADF: Письменность Тай Вьет АВ00-АВ2F: Набор символов эфиопского письма (расширение A) ABC0-ABFF: Мейтей/Манипури AC00-D7AF: Слоги хангыля D800-DB7F: Верхняя часть суррогатных пар DB80-DBFF: Верхняя часть суррогатных пар для частного использования DC00-DFFF: Нижняя часть суррогатных пар E000-F8FF: Область для частного использования F900-FAFF: Совместимые иероглифы ККЯ FB00-FB4F: Алфавитные формы представления FB50-FDCF: Формы представления арабских букв-A FDF0-FDFF: Формы представления арабских букв-A FE00-FE0F: Селекторы вариантов начертания FE10-FE1F: Вертикальные формы FE20-FE2F: Комбинируемые половинки символов FE30-FE4F: Формы совместимости ККЯ FE50-FE6F: Варианты малого размера FE70-FEFF: Формы представления арабских букв-B FF00-FFEF: Полуширинные и полноширинные формы FFF0-FFFF: Специальные символы

  • Что такое Юникод?

    Юникод (англ. Unicode ) - это универсальный стандарт кодирования символов, который позволяет предоставить знаки всех языков мира.

    В отличие от ASCII , один символ кодируется двумя байтами, что позволяет использовать 65 536 символов, против 256 .

    Как известно, один байт - это целое число от нуля до 255 . В свою очередь, байт состоит из восьми бит, которые хранят числовые значения в двоичном виде, где каждая следующая единица текущего бита является в два раза большим значением предыдущего бита. Таким образом, два байта могут хранить в себе число от нуля до 65 535 , что и позволяет использовать 65 536 символов (ноль + 65 535 , ноль - это тоже число, он не является ничем).

    Символы Юникода разделены на секции. Первые 128 символов повторяют таблицу ASCII .

    За отображение символов отвечает семейство кодировок Юникода (Unicode Transformation Format - UTF ). Наиболее известная и широко применяемая кодировка - UTF-8 .

  • Как пользоваться таблицей?

    Символы представлены по 16 штук на строке. Сверху вы можете видеть шестнадцатеричное число от 0 до 16 . Слева аналогичные числа в шестнадцатеричном виде от 0 до FFF .
    Соединив число слева с числом сверху, можно узнать код символа. Например: английская буква F расположена на строке 004 , в столбике 6 : 004 + 6 = код символа 0046 .

    Впрочем, вы можете просто навести курсор на конкретный символ в таблице, чтобы узнать код символа. Либо нажать на символ, чтобы скопировать его, или его код в одном из форматов.

    В поисковое поле можно ввести ключевые слова поиска, например: стрелки, солнце, сердце. Либо можно указать код символа в любом формате, например: 1123, 04BC, چ. Или сам символ, если требуется узнать код символа.

    Поиск по ключевым словам в данный момент находится на стадии разработки, поэтому может не выдавать результатов. Но многие популярные символы уже можно найти.

Поскольку в ряде компьютерных систем (например, Windows NT ) фиксированные 16-битные символы уже использовались в качестве кодировки по умолчанию, было решено все наиболее важные знаки кодировать только в пределах первых 65 536 позиций (так называемая англ. basic multilingual plane, BMP ). Остальное пространство используется для «дополнительных символов» (англ. supplementary characters ): систем письма вымерших языков или очень редко используемых китайских иероглифов, математических и музыкальных символов.

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

Поскольку в UTF-16 можно отобразить только 2 20 +2 16 −2048 (1 112 064) символов, то это число и было выбрано в качестве окончательной величины кодового пространства Юникода.

Хотя кодовая область Юникода была расширена за пределы 2 16 уже в версии 2.0, первые символы в «верхней» области были размещены только в версии 3.1.

Роль этой кодировки в веб-секторе постоянно растёт, на начало 2010 доля веб-сайтов, использующих Юникод, составила около 50 %.

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

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

  • 1.1 (соответствует стандарту ISO/IEC 10646-1:), стандарт 1991-1995 годов.
  • 2.0, 2.1 (тот же стандарт ISO/IEC 10646-1:1993 плюс дополнения: «Amendments» с 1-го по 7-е и «Technical Corrigenda» 1 и 2), стандарт 1996 года.
  • 3.0 (стандарт ISO/IEC 10646-1:2000), стандарт 2000 года.
  • 3.1 (стандарты ISO/IEC 10646-1:2000 и ISO/IEC 10646-2:2001), стандарт 2001 года.
  • 3.2, стандарт 2002 года .
  • 4.0, стандарт .
  • 4.01, стандарт .
  • 4.1, стандарт .
  • 5.0, стандарт .
  • 5.1, стандарт .
  • 5.2, стандарт .
  • 6.0, стандарт .
  • 6.1, стандарт .
  • 6.2, стандарт .

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

Хотя формы записи UTF-8 и UTF-32 позволяют кодировать до 2 31 (2 147 483 648) кодовых позиций, было принято решение использовать лишь 1 112 064 для совместимости с UTF-16. Впрочем, даже и этого более чем достаточно - сегодня (в версии 6.0) используется чуть менее 110 000 кодовых позиций (109 242 графических и 273 прочих символов).

Кодовое пространство разбито на 17 плоскостей по 2 16 (65536) символов. Нулевая плоскость называется базовой , в ней расположены символы наиболее употребительных письменностей. Первая плоскость используется, в основном, для исторических письменностей, вторая - для редко используемых иероглифов ККЯ , третья зарезервирована для архаичных китайских иероглифов . Плоскости 15 и 16 выделены для частного употребления.

Для обозначения символов Unicode используется запись вида «U+xxxx » (для кодов 0…FFFF), или «U+xxxxx » (для кодов 10000…FFFFF), или «U+xxxxxx » (для кодов 100000…10FFFF), где xxx - шестнадцатеричные цифры. Например, символ «я» (U+044F) имеет код 044F = 1103 .

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

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

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

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

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

Юникод - это система для линейного представления текста. Символы, имеющие дополнительные над- или подстрочные элементы, могут быть представлены в виде построенной по определённым правилам последовательности кодов (составной вариант, composite character) или в виде единого символа (монолитный вариант, precomposed character).

Модифицирующие символы

Представление символа «Й» (U+0419) в виде базового символа «И» (U+0418) и модифицирующего символа « ̆» (U+0306)

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

Особый тип модифицирующих символов - селекторы варианта начертания (англ. variation selectors ). Они действуют только на те символы, для которых такие варианты определены. В версии 5.0 варианты начертания определены для ряда математических символов, для символов традиционного монгольского алфавита и для символов монгольского квадратного письма .

Формы нормализации

Поскольку одни и те же символы можно представить различными кодами, что иногда затрудняет обработку, существуют процессы нормализации, предназначенные для приведения текста к определённому стандартному виду.

В стандарте Юникода определены 4 формы нормализации текста:

  • Форма нормализации D (NFD) - каноническая декомпозиция. В процессе приведения текста в эту форму все составные символы рекурсивно заменяются на несколько составных, в соответствии с таблицами декомпозиции.
  • Форма нормализации C (NFC) - каноническая декомпозиция с последующей канонической композицией. Сначала текст приводится к форме D, после чего выполняется каноническая композиция - текст обрабатывается от начала к концу и выполняются следующие правила:
    • Символ S является начальным , если он имеет нулевой класс модификации в базе символов Юникода.
    • В любой последовательности символов, стартующей с начального символа S, символ C блокируется от S, если и только если между S и C есть какой-либо символ B, который или является начальным, или имеет одинаковый или больший класс модификации, чем C. Это правило распространяется только на строки, прошедшие каноническую декомпозицию.
    • Первичным композитом считается символ, у которого есть каноническая декомпозиция в базе символов Юникода (или каноническая декомпозиция для хангыля и он не входит в список исключений).
    • Символ X может быть первично совмещён с символом Y, если и только если существует первичный композит Z, канонически эквивалентный последовательности .
    • Если очередной символ C не блокируется последним встреченным начальным базовым символом L и он может быть успешно первично совмещён с ним, то L заменяется на композит L-C, а C удаляется.
  • Форма нормализации KD (NFKD) - совместимая декомпозиция. При приведении в эту форму все составные символы заменяются, используя как канонические карты декомпозиции Юникода, так и совместимые карты декомпозиции, после чего результат ставится в каноническом порядке.
  • Форма нормализации KC (NFKC) - совместимая декомпозиция с последующей канонической композицией.

Термины «композиция» и «декомпозиция» понимают под собой соответственно соединение или разложение символов на составные части.

Примеры

Исходный текст NFD NFC NFKD NFKC
Français Franc\u0327ais Fran\xe7ais Franc\u0327ais Fran\xe7ais
А, Ё, Й \u0410, \u0401, \u0419 \u0410, \u0415\u0308, \u0418\u0306 \u0410, \u0401, \u0419
\u304b\u3099 \u304c \u304b\u3099 \u304c
Henry IV Henry IV Henry IV Henry IV Henry IV
Henry Ⅳ Henry \u2163 Henry \u2163 Henry IV Henry IV

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

Стандарт Юникод поддерживает письменности языков как с направлением написания слева направо (англ. left-to-right, LTR ), так и с написанием справа налево (англ. right-to-left, RTL ) - например, арабское и еврейское письмо. В обоих случаях символы хранятся в «естественном» порядке; их отображение с учётом нужного направления письма обеспечивается приложением.

Кроме того, Юникод поддерживает комбинированные тексты, сочетающие фрагменты с разным направлением письма. Данная возможность называется двунаправленность (англ. bidirectional text, BiDi ). Некоторые упрощённые обработчики текста (например, в сотовых телефонах) могут поддерживать Юникод, но не иметь поддержки двунаправленности. Все символы Юникода поделены на несколько категорий: пишущиеся слева направо, пишущиеся справа налево, и пишущиеся в любом направлении. Символы последней категории (в основном это знаки пунктуации) при отображении принимают направление окружающего их текста.

Представленные символы

Юникод включает практически все современные письменности , в том числе:

и другие.

С академическими целями добавлены многие исторические письменности, в том числе: руны , древнегреческая , египетские иероглифы , клинопись , письменность майя , этрусский алфавит .

В Юникоде представлен широкий набор математических и музыкальных символов, а также пиктограмм .

Однако в Юникод принципиально не включаются логотипы компаний и продуктов, хотя они и встречаются в шрифтах (например, логотип Apple в кодировке MacRoman (0xF0) или логотип Windows в шрифте Wingdings (0xFF)). В юникодовских шрифтах логотипы должны размещаться только в области пользовательских символов.

ISO/IEC 10646

Консорциум Юникода работает в тесной связи с рабочей группой ISO/IEC/JTC1/SC2/WG2, которая занимается разработкой международного стандарта 10646 (ISO /IEC 10646). Между стандартом Юникода и ISO/IEC 10646 установлена синхронизация, хотя каждый стандарт использует свою терминологию и систему документации.

Сотрудничество Консорциума Юникода с Международной организацией по стандартизации (англ. International Organization for Standardization, ISO ) началось в 1991 году . В 1993 году ISO выпустила стандарт DIS 10646.1. Для синхронизации с ним Консорциум утвердил стандарт Юникода версии 1.1, в который были внесены дополнительные символы из DIS 10646.1. В результате значения закодированных символов в Unicode 1.1 и DIS 10646.1 полностью совпали.

В дальнейшем сотрудничество двух организаций продолжилось. В 2000 году стандарт Unicode 3.0 был синхронизирован с ISO/IEC 10646-1:2000. Предстоящая третья версия ISO/IEC 10646 будет синхронизирована с Unicode 4.0. Возможно, эти спецификации даже будут опубликованы как единый стандарт.

Аналогично форматам UTF-16 и UTF-32 в стандарте Юникода, стандарт ISO/IEC 10646 также имеет две основные формы кодирования символов: UCS-2 (2 байта на символ, аналогично UTF-16) и UCS-4 (4 байта на символ, аналогично UTF-32). UCS значит универсальный многооктетный (многобайтовый) кодированный набор символов (англ. universal multiple-octet coded character set ). UCS-2 можно считать подмножеством UTF-16 (UTF-16 без суррогатных пар), а UCS-4 является синонимом для UTF-32.

Способы представления

Юникод имеет несколько форм представления (англ. Unicode transformation format, UTF ): UTF-8 , UTF-16 (UTF-16BE, UTF-16LE) и UTF-32 (UTF-32BE, UTF-32LE). Была разработана также форма представления UTF-7 для передачи по семибитным каналам, но из-за несовместимости с ASCII она не получила распространения и не включена в стандарт. 1 апреля 2005 года были предложены две шуточные формы представления: UTF-9 и UTF-18 (RFC 4042).

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-16 big-endian ), либо после младшего (англ. UTF-16 little-endian ). Аналогично существует два варианта четырёхбайтной кодировки - UTF-32BE и UTF-32LE.

Для определения формата представления Юникода в начало текстового файла записывается сигнатура - символ U+FEFF (неразрывный пробел с нулевой шириной), также именуемый меткой порядка байтов (англ. byte order mark, BOM ). Это позволяет различать UTF-16LE и UTF-16BE, поскольку символа U+FFFE не существует. Также этот способ иногда применяется для обозначения формата UTF-8, хотя к этому формату и неприменимо понятие порядка байтов. Файлы, следующие этому соглашению, начинаются с таких последовательностей байтов:

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 допускается Юникодом (хотя реальные тексты редко начинаются с него).

Файлы в кодировках UTF-16 и UTF-32, не содержащие BOM, должны иметь порядок байтов big-endian (unicode.org).

Юникод и традиционные кодировки

Внедрение Юникода привело к изменению подхода к традиционным 8-битным кодировкам. Если раньше кодировка задавалась шрифтом, то теперь она задаётся таблицей соответствия между данной кодировкой и Юникодом. Фактически 8-битные кодировки превратились в форму представления некоторого подмножества Юникода. Это намного упростило создание программ, которые должны работать с множеством разных кодировок: теперь, чтобы добавить поддержку ещё одной кодировки, надо всего лишь добавить ещё одну таблицу перекодировки в Юникод.

Кроме того, многие форматы данных позволяют вставлять любые символы Юникода, даже если документ записан в старой 8-битной кодировке. Например, в HTML можно использовать коды с амперсандом .

Реализации

Большинство современных операционных систем в той или иной степени обеспечивают поддержку Юникода.

Одной из первых успешных коммерческих реализаций Юникода стала среда программирования Java . В ней принципиально отказались от 8-битного представления символов в пользу 16-битного. Сейчас большинство языков программирования поддерживают строки Юникода, хотя их представление может различаться в зависимости от реализации.

Методы ввода

Консоль GNU/Linux также допускает ввод символа Юникода по его коду - для этого десятичный код символа нужно ввести цифрами расширенного блока клавиатуры при зажатой клавише Alt. Можно вводить символы и по их шестнадцатеричному коду: для этого нужно зажать клавишу AltGr, и для ввода цифр A-F использовать клавиши расширенного блока клавиатуры от NumLock до Enter (по часовой стрелке). Поддерживается также и ввод в соответствии с ISO 14755. Для того чтобы перечисленные способы могли работать, нужно включить в консоли режим Юникода вызовом unicode_start (1) и выбрать подходящий шрифт вызовом setfont (8).

Написание «Юникод» уже твёрдо вошло в русскоязычные тексты. Согласно «Яндексу », частота использования этого слова примерно в 11 раз превышает «Уникод» . В Википедии используется более распространённый вариант.

На сайте Консорциума есть специальная страница, где рассматриваются проблемы передачи слова «Unicode» в различных языках и системах письма. Для русской кириллицы указан вариант «Юникод» .

Формы, принятые иностранными организациями для русской передачи слова «Unicode», являются рекомендательными.

См. также

  • Проект:Внесение символов алфавитов народов России в Юникод

Примечания

  1. Unicode Transcriptions (англ.) . Архивировано из первоисточника 22 августа 2011. Проверено 10 мая 2010.
  2. Уникод в словаре Paratype
  3. The Unicode® Standard: A Technical Introduction . Архивировано
  4. History of Unicode Release and Publication Dates . Архивировано из первоисточника 22 августа 2011. Проверено 4 июля 2010.
  5. The Unicode Consortium . Архивировано из первоисточника 22 августа 2011. Проверено 4 июля 2010.
  6. Foreword . Архивировано из первоисточника 22 августа 2011. Проверено 4 июля 2010.
  7. General Structure . Архивировано из первоисточника 22 августа 2011. Проверено 5 июля 2010.
  8. European Alphabetic Scripts . Архивировано из первоисточника 22 августа 2011. Проверено 4 июля 2010.
  9. Unicode 88 . Архивировано из первоисточника 22 августа 2011. Проверено 8 июля 2010.
  10. Unicode and Microsoft Windows NT (англ.) . Microsoft Support . Архивировано
  11. Unicode используется почти на 50% веб-сайтов (рус.) . Архивировано из первоисточника 22 августа 2011.
  12. Roadmap to the TIP (Tertiary Ideographic Plane)
  13. http://www.cl.cam.ac.uk/~mgk25/ucs/utf-8-history.txt (англ.)
  14. Регистр в Unicode - это непросто
  15. В большинстве шрифтов для ПК реализованы «прописные» (маюскульные) моноширинные цифры.
  16. В некоторых случаях документ (не простой текст) в Юникоде может занимать существенно меньше места, чем документ в однобайтовой кодировке. Например, если некая веб-страница содержит примерно поровну русского и греческого текста, то в однобайтовой кодировке придётся либо русские, либо греческие буквы записывать, используя возможности формата документов, в виде кодов с амперсандом, которые занимают 6-7 байт на символ (при использовании десятичных кодов), т. е. в среднем на букву придётся 3,5-4 байта, в то время как UTF-8 занимает только 2 байта на греческую или русскую букву.
  17. Один из файлов шрифтов Arial Unicode имеет размер 24 мегабайта; существует Times New Roman размером 120 мегабайт, он содержит количество символов, близкое к 65536.
  18. Даже для самого современного и дорогого мобильного телефона затруднительно выделить 120 Мбайт памяти для полного Юникод-шрифта. На практике использование полных шрифтов требуется редко.
  19. 350 тыс. страниц «Юникод » против 31 тыс. страниц «Уникод ».

Ссылки

  • Официальный сайт Консорциума Юникода (англ.)
  • Unicode в каталоге ссылок Open Directory Project (dmoz). (англ.)
  • Что такое Unicode? (рус.)
  • Последняя версия стандарта Юникод (англ.)
  • Таблица символов Юникода с названиями и описаниями (рус.) (англ.)
  • Связь Юникода и ISO/IEC 10646 (файл PDF) (англ.)
  • FAQ по UTF-8 и Unicode (англ.)
  • Кириллица в Юникоде: