как называется международный стандарт кодирования текстовых символов
Что такое Юникод?
Юникод (Unicode), это многоязычный, основанный на ASCII стандарт кодирования символов, а также, связанное с ним, семейство многобайтных кодировок. Если некоторые слова из предыдущего предложения вам не понятны, давайте рассмотрим их подробнее.
Что такое кодировка
Современные компьютеры всё ещё достаточно глупые и, в большинстве своём, не умеют работать ни с чем, кроме чисел. Мы рассматриваем на своих мониторах фотографии, смотрим фильмы, играем в игры. Но для компьютеров всё это лишь безликий поток нулей и единичек. Так же и текст — для компьютера это просто набор байтов. Буквы и любые другие символы представляются в машинной памяти, как числа.
Поэтому программистам при работе с текстом приходится делать подобные соглашения: «А давайте каждому символу будет соответствовать один байт. Причём, если в байте будет число 43, то будем считать, что это цифра ноль. А если число 66, то пусть это будет заглавная латинская буква B».
Подобный список всех используемых символов и соответствующих им чисел и называется кодировкой. Вы, скорее всего, уже слышали названия многих кодировок: Windows-1251, KOI-8, ну и, конечно, Unicode.
Крякозябры
Наверное, часто бывала ситуация, когда вы открываете страницу в браузере, а там вместо текста какая-то мешанина из чудных символов. Или просто сплошные вопросительные знаки. Или вы пишете любовное письмо своей девушке, а она звонит вам и говорит «что за нечитаемый бред ты мне прислал? Я обиделась».
Это всё из-за того, что в мире наплодилось слишком много разных кодировок. И текст в одной из них выглядит совершенно не так, как в другой. Дело в том, что компьютер не знает какую кодировку вы используете для текста. Для него это просто последовательность каких-то чисел.
Например, ваш текстовый редактор настроен на кодировку Windows-1251. И вы пишете «Здравствуйте, дорогая Маша!». Вы нажимаете первую букву и программа думает: «ага, русская заглавная буква Зэ — код 199». И записывает число 199 в файл. Маша получает ваше письмо, но в её почтовом клиенте стоит кодировка KOI8-R (потому что Маша любит старый Unix). А в этой кодировке числу 199 соответствует строчная буква «г». И Маша читает: «гДПЮБЯРБСИРЕ, ДНПНЦЮЪ лЮЬЮ!». Маша обиделась!
Чтобы подобного не происходило, нужно каким-то образом указывать кодировку в которой набран текст. Например, в HTML это делается с помощью тега:
ASCII
В определённый момент времени распространение получила кодировка ASCII (American Standard Code for Information Interchange). В ней определены 128 символов с кодами от 0 до 127. Сюда включён латинский алфавит, цифры и основные знаки препинания (
Практически все современные кодировки, использующиеся на персональных компьютерах являются ASCII-совместимыми. То есть первые 128 символов у них кодируются одинаково, а различия начинаются с кода 128 и выше. Вышеупомянутые Windows-1251 и KOI8-r также основаны на ASCII и если бы письмо начиналось бы с «Hello, my dear Maria!», то недопонимания не возникло бы.
Основан на ASCII и Юникод.
Однобайтные кодировки
Одна из причин, по которой появилось такое большое количество кодировок, это то, что вначале каждая компания придумывала свои стандарты, не обращая внимания на другие. Вторая причина заключается в том, что старые кодировки были однобайтными. То есть каждому символу в тексте соответствует один байт в памяти компьютера.
Однобайтные кодировки всем хороши: они компактны, с ними легко работать (нужно достать пятый символ — просто берём пятый байт от начала). Единственная проблема: в них помещается мало символов. Ровно столько, сколько значений может принимать один байт, то есть обычно, это 256. Например, в Windows-1251 мы отдали 128 символов под ASCII, добавили 66 букв русского алфавита (строчные и заглавные), несколько знаков препинания и вот у нас уже остаётся не так много свободных позиций. Даже на псевдографику не хватает.
То есть свести в одну кодировку все возможные символы даже европейских алфавитов достаточно сложно. А уж для китайцев с их тысячами иероглифов вообще всё тоскливо. А о всяких смайликах, эмоджи и иконках самолётиков и думать нечего. Поэтому для кириллицы приходилось изобретать свою кодировку, а для греческого языка другую.
Впрочем, такая ситуация сохранялась достаточно долго. Потому что проблемы англоязычных пользователей и программистов решила ASCII, а до китайских проблем им не было дела. С ростом же глобального интернета вдруг оказалось, что в мире говорят не только на английском языке, поэтому с кодировками нужно что-то менять.
Многобайтные кодировки
Самым простым решением было взять два байта вместо одного. Плюс такого решения: теперь можно в рамках одной кодировки использовать 65 тысяч символов. Минусы тоже есть:
Стандарт Unicode
В конечном итоге всё вылилось в стандарт Юникода, который худо-бедно, но решает практически все стоявшие перед кодировками проблемы.
С одной стороны, Юникод позволяет кодировать практически неограниченное количество символов. В последнем стандарте определено более 100 000 различных символов всех современных и многих уже мёртвых языков, а также различные иконки и пиктограммы. С другой стороны, некоторые способы кодирования позволяют Юникоду оставаться ASCII-совместимыми. Что позволяет работать, как и раньше многим программам, а также американским и другим англоязычным пользователям, многие из которых появления Юникода даже не заметили. В Юникоде также собраны все символы из всех популярных стандартов кодирования, что позволяет преобразовать в него любой текст из старой кодировки.
Практически все современные программы, работающие с текстом, понимают Юникод. Более того, обычно они в нём и работают. Например, даже когда вы открываете сайт в старой доброй Windows-1251, браузер сначала внутри у себя перекодирует все тексты в Юникод, а потом отображает их. В общем, Юникод, это светлое будущее интернета и всей компьютерной индустрии.
Отличие набора символов от кодировки
Термины «кодировка», «стандарт кодирования», «набор символов» обычно используются, как синонимы, но между ними есть и тонкие различия. Важно понимать разницу между «стандартом» и, собственно, «кодировкой». Некий стандарт просто говорит, что буква «A», это число 65, а буква «B» — 66. Кодировка же отвечает за то, как эти числа представить в памяти компьютера.
То есть в стандарте Юникода определено, что кириллической букве «А» соответствует абстрактное число 1040. Как представить это число в виде последовательности байтов решает уже конкретная кодировка — UTF-8, UTF-16, UTF-32.
То есть текстовый файл не может быть в кодировке «Юникод», а только в конкретной кодировке «UTF-8» или «UTF-16».
Кодировки и шрифты
Юникод, как и любая другая кодировка не описывает того, как следует отрисовывать символы. Для него число 1040, это «кириллическая заглавная буква А». А какая она, печатная, прописная, наклонная, жирная или с завитушками, это не его дело.
За изображение символа отвечают шрифты. Поэтому один и тот же символ в разных шрифтах может выглядеть по разному, а то и вообще отсутствовать.
© Таблица символов Юникода, 2012–2021.
Юникод® — это зарегистрированная торговая марка консорциума Юникод в США и других странах. Этот сайт никак не связан с консорциумом Юникод. Официальный сайт Юникода располагается по адресу www.unicode.org.
Мы используем 🍪cookie, чтобы сделать сайт максимально удобным для вас. Подробнее
Unicode: как человечество пришло к международному стандарту кодирования символов
Уверена, что большинство читателей хоть немного знакомы с терминами «Unicode» и «UTF-8». Но все ли знают, что именно стоит за ними? По сути они относятся к стандартам кодирования символов, также известным как наборы символов. Концепция появилась во времена оптического телеграфа, а не в компьютерную эру, как можно было подумать. Еще в 18 веке существовала потребность в быстрой передаче информации на большие расстояния, для чего использовались так называемые телеграфные коды. Информация кодировалась с помощью оптических, электронных и других средств.
В течение сотен лет, прошедших с момента изобретения первого телеграфного кода, не было никаких реальных попыток международной стандартизации таких схем кодирования. Даже первые десятилетия эры телетайпов и домашних компьютеров мало что изменили. Несмотря на то, что EBCDIC (8-битная кодировка символов IBM, продемонстрированная на перфокарте в заглавной иллюстрации) и ASCII немного улучшили ситуацию, способа кодировать растущую коллекцию символов без значительных затрат памяти все еще не было.
Развитие Юникода началось в конце 1980-х годов, когда рост обмена цифровой информацией во всем мире сделал потребность в единой системе кодирования более насущной. В наши дни Юникод позволяет нам использовать единую схему кодирования для всего — от базового английского текста и традиционного китайского, вьетнамского, даже майянского языков до пиктограмм, которые мы привыкли называть «эмодзи».
От кода к графикам
Еще в эпоху Римской империи было хорошо известно, что быстрая передача информации имеет значение. В течение долгого времени это означало наличие гонцов на лошадях, которые доставляли сообщения на большие расстояния, или их эквивалента. Как улучшить систему доставки информации, придумали еще в 4 веке до нашей эры — так появились водяной телеграф и система сигнальных огней. Но действительно эффективной передача данные на большие расстояния стала лишь в 18 веке.
Об оптическом телеграфе, также называемом «семафоре», мы уже писали в статье об истории оптической связи. Он состоял из ряда ретрансляционных станций, каждая из которых была оборудована системой поворотных стрелок, используемой для отображения символов телеграфного кода. Система братьев Шапп, которая использовалась французскими войсками между 1795 и 1850-ми годами, была основана на деревянной перекладине с двумя подвижными концами (рычагами), каждый из которых мог перемещаться в одно из семи положений. Вместе с четырьмя позициями для перекладины семафор в теории мог обозначить 196 символов (4x7x7). На практике число сокращалось до 92-94 позиций.
Французский оптический телеграфный код братьев Шапп, 1809 год
Система семафоров использовалась не столько для прямого кодирования символов, сколько для обозначения определенных строк в кодовой книге. Метод подразумевал, что по нескольким кодовым сигналам можно было расшифровать все сообщение. Это ускоряло передачу и делало бессмысленным перехват сообщений.
Улучшение производительности
Затем оптический телеграф был заменен электрическим. Это означало, что времена, когда кодировки фиксировались людьми, наблюдающими за ближайшей релейной вышкой, прошли. С двумя телеграфными устройствами, соединенными металлическим проводом, инструментом для передачи информации стал электрический ток. Это изменение привело к появлению новых кодов электрического телеграфа, а код Морзе в итоге стал международным стандартом (за исключением США, которые продолжали использовать американский код Морзе за пределами радиотелеграфии) с момента его изобретения в Германии в 1848 году.
Международный код Морзе имеет преимущество перед американским аналогом: в нем используется больше тире, чем точек. Такой подход снижает скорость передачи, но улучшает прием сообщения на другом конце линии. Это было необходимо, когда длинные сообщения передавались по многокилометровым проводам операторами разного уровня подготовки.
По мере развития технологий ручной телеграф был заменен на Западе автоматическим. В нем использовался 5-битный код Бодо, а также производный от него код Мюррея (последний основывался на использовании бумажной ленты, в которой пробивались отверстия). Система Мюррея позволяла заранее подготовить ленту с сообщениями, а затем загрузить ее в устройство для чтения, чтобы сообщение передалось автоматически. Код Бодо лег в основу международного телеграфного алфавита версии 1 (ITA 1), а модифицированный код Бодо-Мюррея лег в основу ITA 2, которая использовалась вплоть до 1960-х годов.
К 1960-м годам ограничение в 5 бит на символ уже не требовалось, что привело к развитию 7-битного ASCII в США и таких стандартов, как JIS X 0201 (для японских символов катакана) в Азии. В сочетании с телетайпами, которые тогда широко использовались, это позволяло передавать довольно сложные сообщения, включающие символы верхнего и нижнего регистров.
Полный набор символов 7-битного ASCII
В течение 1970-х и начала 1980-х годов ограничений 7- и 8-битных кодировок, таких как расширенный ASCII (например, ISO 8859-1 или Latin 1), было достаточно для основных домашних компьютеров и офисных нужд. Несмотря на это, потребность в улучшении была очевидна, поскольку общие задачи, такие как обмен цифровыми документами и текстом, часто приводили к хаосу из-за множества кодировок ISO 8859. Первый шаг был сделан в 1991 году — появился 16-битный Unicode 1.0.
Развитие 16-битных кодировок
Удивительно, что всего в 16 битах Unicode удалось охватить не только все западные системы письма, но и многие китайские иероглифы и множество специальных символов, используемых, например, в математике. С 16 битами, допускающими до 65 536 кодовых точек, Unicode 1.0 легко вмещал 7 129 символов. Но к моменту появления Unicode 3.1 в 2001 году он содержал не менее 94 140 символов.
Сейчас, в своей 13 версии, Unicode содержит в общей сложности 143 859 символов, не считая управляющих. Изначально Unicode предполагалось использовать только для кодирования систем записи, которые применяются в настоящее время. Но к релизу Unicode 2.0 в 1996 году стало понятно, что эту цель следует переосмыслить, чтобы кодировать даже редкие и исторические символы. Чтобы достичь этого без обязательной 32-битной кодировки каждого символа, Unicode изменился: он позволил не только кодировать символы напрямую, но и использовать их компоненты, или графемы.
Концепция в чем-то похожа на векторные изображения, где не указывается каждый пиксель, а вместо этого описываются элементы, составляющие рисунок. В результате кодировка Unicode Transformation Format 8 (UTF-8) поддерживает 2 31 кодовую точку, при этом для большинства символов в текущем наборе символов Unicode обычно требуется один-два байта.
Unicode на любой вкус и цвет
На данный момент довольно много людей, вероятно, сбиты с толку из-за различных терминов, которые используются, когда дело доходит до Unicode. Поэтому здесь важно отметить, что Unicode относится к стандарту, а различные Unicode Transformation Format являются его реализациями. UCS-2 и USC-4 — это более старые 2- и 4-байтовые реализации Unicode, при этом UCS-4 идентичен UTF-32, а UCS-2 заменяем UTF-16.
Обзор базовой многоязычной плоскости Unicode, первой плоскости Unicode практически со всеми современными языками
UTF-32, как следует из названия, кодирует каждый символ в четырех байтах. Это немного расточительно, зато абсолютно предсказуемо. Тот же UTF-8 символ может кодировать символ в диапазоне от одного до четырех байтов. В случае с UTF-32 определение количества символов в строке — это простая арифметика: взять все количество байтов и поделить на четыре. Это привело к появлению компиляторов и некоторых языков, например Python, позволяющих использовать UTF-32 для представления строк Unicode.
Однако из всех форматов Unicode наиболее популярным на сегодняшний день является UTF-8. Этому во многом способствовала всемирная сеть Интернет, где большинство веб-сайтов обслуживают свои HTML-документы в кодировке UTF-8. Из-за компоновки различных плоскостей кодовых точек в UTF-8, Western и многие другие распространенные системы записи умещаются в пределах двух байтов. Если сравнивать со старыми кодировками ISO 8859 и Shift JIS, фактически тот же текст в UTF-8 не занимает больше места, чем раньше.
От оптических башен до интернета
Времена конных гонцов, ретрансляционных вышек и небольших телеграфных станций прошли. Коммуникационные технологии сильно развились. Даже те дни, когда телетайпы были обычным явлением в офисах, вспоминаются с трудом. Однако на каждом этапе развития истории человечеству было необходимость кодировать, хранить и передавать информацию. И это привело нас к тому, что теперь мы можем мгновенно передавать сообщение по всему миру в системе символов, которую можно декодировать независимо от того, где вы находитесь.
Для тех, кому довелось переключаться между кодировками ISO 8859 в почтовых клиентах и веб-браузерах, чтобы получить что-то, похожее на исходное текстовое сообщение, поддержка Unicode стала благословением. Я могу понять этих людей. Когда 7-битный ASCII (или EBCDIC) был безальтернативной технологией, иногда приходилось тратить часы, разбираясь в символьной путанице цифрового документа, полученного из европейского или американского офиса.
Даже если Unicode не лишен проблем, трудно не испытывать благодарности, сравнивая его с тем, что было раньше. Вот они, 30 лет существования Unicode.
Представление символов, таблицы кодировок
Содержание
Представление символов в вычислительных машинах [ править ]
В вычислительных машинах символы не могут храниться иначе, как в виде последовательностей бит (как и числа). Для передачи символа и его корректного отображения ему должна соответствовать уникальная последовательность нулей и единиц. Для этого были разработаны таблицы кодировок.
Таблицы кодировок [ править ]
На заре компьютерной эры на каждый символ было отведено по пять бит. Это было связано с малым количеством оперативной памяти на компьютерах тех лет. В эти [math]32[/math] символа входили только управляющие символы и строчные буквы английского алфавита.
С ростом производительности компьютеров стали появляться таблицы кодировок с большим количеством символов. Первой семибитной кодировкой стала ASCII7. В нее уже вошли прописные буквы английского алфавита, арабские цифры, знаки препинания. Затем на ее базе была разработана ASCII8, в которым уже стало возможным хранение [math]256[/math] символов: [math]128[/math] основных и еще столько же расширенных. Первая часть таблицы осталась без изменений, а вторая может иметь различные варианты (каждый имеет свой номер). Эта часть таблицы стала заполняться символами национальных алфавитов.
Но для многих языков (например, арабского, японского, китайского) [math]256[/math] символов недостаточно, поэтому развитие кодировок продолжалось, что привело к появлению UNICODE.
Кодировки стандарта ASCII [ править ]
| Определение: |
| ASCII — таблицы кодировок, в которых содержатся основные символы (английский алфавит, цифры, знаки препинания, символы национальных алфавитов(свои для каждого региона), служебные символы) и длина кода каждого символа [math]n = 8[/math] бит. |
Кодировки стандарта ASCII ( [math]8[/math] бит):
Структурные свойства таблицы [ править ]
Кодировки стандарта UNICODE [ править ]
Юникод или Уникод (англ. Unicode) — это промышленный стандарт обеспечивающий цифровое представление символов всех письменностей мира, и специальных символов.
Стандарт предложен в 1991 году некоммерческой организацией «Консорциум Юникода» (англ. Unicode Consortium, Unicode Inc.). Применение этого стандарта позволяет закодировать очень большое число символов из разных письменностей. Стандарт состоит из двух основных разделов: универсальный набор символов (англ. UCS, universal character set) и семейство кодировок (англ. UTF, Unicode transformation format). Универсальный набор символов задаёт однозначное соответствие символов кодам — элементам кодового пространства, представляющим неотрицательные целые числа.Семейство кодировок определяет машинное представление последовательности кодов UCS.
Коды в стандарте Unicode разделены на несколько областей. Область с кодами от U+0000 до U+007F содержит символы набора ASCII с соответствующими кодами. Далее расположены области знаков различных письменностей, знаки пунктуации и технические символы. Под символы кириллицы выделены области знаков с кодами от U+0400 до U+052F, от U+2DE0 до U+2DFF, от U+A640 до U+A69F. Часть кодов зарезервирована для использования в будущем.
Кодовое пространство [ править ]
Хотя формы записи UTF-8 и UTF-32 позволяют кодировать до [math]2^<31>[/math] [math](2\ 147\ 483\ 648)[/math] кодовых позиций, было принято решение использовать лишь [math]1\ 112\ 064[/math] для совместимости с UTF-16. Впрочем, даже и этого на текущий момент более чем достаточно — в версии 6.0 используется чуть менее [math]110\ 000[/math] кодовых позиций ( [math]109\ 242[/math] графических и [math]273[/math] прочих символов).
Кодовое пространство разбито на [math]17[/math] плоскостей (англ. planes) по [math]2^<16>[/math] [math](65\ 536)[/math] символов. Нулевая плоскость называется базовой, в ней расположены символы наиболее употребительных письменностей. Первая плоскость используется, в основном, для исторических письменностей, вторая — для для редко используемых иероглифов китайского письма, третья зарезервирована для архаичных китайских иероглифов. Плоскости [math]15[/math] и [math]16[/math] выделены для частного употребления.
| Плоскости Юникода | ||
|---|---|---|
| Плоскость | Название | Диапазон символов |
| Plane 0 | Basic multilingual plane (BMP) | U+0000…U+FFFF |
| Plane 1 | Supplementary multilingual plane (SMP) | U+10000…U+1FFFF |
| Plane 2 | Supplementary ideographic plane (SIP) | U+20000…U+2FFFF |
| Planes 3-13 | Unassigned | U+30000…U+DFFFF |
| Plane 14 | Supplementary special-purpose plane (SSP) | U+E0000…U+EFFFF |
| Planes 15-16 | Supplementary private use area (S PUA A/B) | U+F0000…U+10FFFF |
Модифицирующие символы [ править ]
Графические символы в Юникоде делятся на протяжённые и непротяжённые. Непротяжённые символы при отображении не занимают дополнительного места в строке. К примеру, к ним относятся знак ударения. Протяжённые и непротяжённые символы имеют собственные коды, но последние не могут встречаться самостоятельно. Протяжённые символы называются базовыми (англ. base characters), а непротяженные — модифицирующими (англ. combining characters). Например символ «Й» (U+0419) может быть представлен в виде базового символа «И» (U+0418) и модифицирующего символа « ̆» (U+0306).
Способы представления [ править ]
Юникод имеет несколько форм представления (англ. Unicode Transformation Format, UTF): UTF-8, UTF-16 (UTF-16BE, UTF-16LE) и UTF-32 (UTF-32BE, UTF-32LE). Была разработана также форма представления UTF-7 для передачи по семибитным каналам, но из-за несовместимости с ASCII она не получила распространения и не включена в стандарт.
UTF-8 [ править ]
Символы UTF-8 получаются из Unicode cледующим образом:
| Unicode | UTF-8 | Представленные символы |
|---|---|---|
| 0x00000000 — 0x0000007F | 0xxxxxxx | ASCII, в том числе английский алфавит, простейшие знаки препинания и арабские цифры |
| 0x00000080 — 0x000007FF | 110xxxxx 10xxxxxx | кириллица, расширенная латиница, арабский алфавит, армянский алфавит, греческий алфавит, еврейский алфавит и коптский алфавит; сирийское письмо, тана, нко; Международный фонетический алфавит; некоторые знаки препинания |
| 0x00000800 — 0x0000FFFF | 1110xxxx 10xxxxxx 10xxxxxx | все другие современные формы письменности, в том числе грузинский алфавит, индийское, китайское, корейское и японское письмо; сложные знаки препинания; математические и другие специальные символы |
| 0x00010000 — 0x001FFFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx | музыкальные символы, редкие китайские иероглифы, вымершие формы письменности |
| 111111xx | служебные символы c, d, e, f |
Несмотря на то, что UTF-8 позволяет указать один и тот же символ несколькими способами, только наиболее короткий из них правильный. Остальные формы, называемые overlong sequence, отвергаются по соображениям безопасности.
Принцип кодирования [ править ]
Правила записи кода одного символа в UTF-8 [ править ]
1. Если размер символа в кодировке UTF-8 = [math]1[/math] байт
Код имеет вид (0aaa aaaa), где «0» — просто ноль, остальные биты «a» — это код символа в кодировке ASCII;
2. Если размер символа в кодировке в UTF-8 [math]\gt 1[/math] байт (то есть от [math]2[/math] до [math]6[/math] ):
2.1 Первый байт содержит количество байт символа, закодированное в единичной системе счисления; 2.2 «0» — бит терминатор, означающий завершение кода размера 2.3 далее идут значащие байты кода, которые имеют вид (10xx xxxx), где «10» — биты признака продолжения, а «x» — значащие биты.
В общем случае варианты представления одного символа в кодировке UTF-8 выглядят так:
Определение длины кода в UTF-8 [ править ]
| Количество байт UTF-8 | Количество значащих бит |
|---|---|
| [math]1[/math] | [math]7[/math] |
| [math]2[/math] | [math]11[/math] |
| [math]3[/math] | [math]16[/math] |
| [math]4[/math] | [math]21[/math] |
| [math]5[/math] | [math]26[/math] |
| [math]6[/math] | [math]31[/math] |
[math]C = 7[/math] при [math]n=1[/math]
[math]C = n\cdot5+1[/math] при [math]n\gt 1[/math]
UTF-16 [ править ]
UTF-16LE и UTF-16BE [ править ]
Один символ кодировки UTF-16 представлен последовательностью двух байт или двух пар байт. Который из двух байт в словах идёт впереди, старший или младший, зависит от порядка байт. Подробнее об этом будет сказано ниже.
UTF-32 [ править ]
UTF-32 — один из способов кодирования символов из Юникод, использующий для кодирования любого символа ровно [math]32[/math] бита. Остальные кодировки, UTF-8 и UTF-16, используют для представления символов переменное число байт. Символ UTF-32 является прямым представлением его кодовой позиции (англ. code point).
Главный недостаток UTF-32 — это неэффективное использование пространства, так как для хранения символа используется четыре байта. Символы, лежащие за пределами нулевой (базовой) плоскости кодового пространства редко используются в большинстве текстов. Поэтому удвоение, в сравнении с UTF-16, занимаемого строками в UTF-32 пространства не оправдано.
Порядок байт [ править ]
В современной вычислительной технике и цифровых системах связи информация обычно представлена в виде последовательности байт. В том случае, если число не может быть представлено одним байтом, имеет значение в каком порядке байты записываются в памяти компьютера или передаются по линиям связи. Часто выбор порядка записи байт произволен и определяется только соглашениями.
[math]M = \sum_^
Варианты записи [ править ]
Порядок от старшего к младшему [ править ]
В этом же виде (используя представление в десятичной системе счисления) записываются числа индийско-арабскими цифрами в письменностях с порядком знаков слева направо (латиница, кириллица). Для письменностей с обратным порядком (арабская) та же запись числа воспринимается как «от младшего к старшему».
Порядок байт от старшего к младшему применяется во многих форматах файлов — например, PNG, FLV, EBML.
Порядок от младшего к старшему [ править ]
В противоположность порядку big-endian, соглашение little-endian поддерживают меньше кросс-платформенных протоколов и форматов данных; существенные исключения: USB, конфигурация PCI, таблица разделов GUID, рекомендации FidoNet.
Переключаемый порядок [ править ]
Многие процессоры могут работать и в порядке от младшего к старшему, и в обратном, например, ARM, PowerPC (но не PowerPC 970), DEC Alpha, MIPS, PA-RISC и IA-64. Обычно порядок байт выбирается программно во время инициализации операционной системы, но может быть выбран и аппаратно перемычками на материнской плате. В этом случае правильнее говорить о порядке байт операционной системы. Переключаемый порядок байт иногда называют англ. bi-endian.
Смешанный порядок [ править ]
Смешанный порядок байт (англ. middle-endian) иногда используется при работе с числами, длина которых превышает машинное слово. Число представляется последовательностью машинных слов, которые записываются в формате, естественном для данной архитектуры, но сами слова следуют в обратном порядке.
В процессорах VAX и ARM используется смешанное представление для длинных вещественных чисел.
Различия [ править ]
Для записи длинных чисел (чисел, длина которых существенно превышает разрядность машины) обычно предпочтительнее порядок слов в числе little-endian (поскольку арифметические операции над длинными числами производятся от младших разрядов к старшим). Порядок байт в слове — обычный для данной архитектуры.
Маркер последовательности байт [ править ]
Для определения формата представления Юникода в начало текстового файла записывается сигнатура — символ U+FEFF (неразрывный пробел с нулевой шириной), также именуемый маркером последовательности байт (англ. byte order mark (BOM)). Это позволяет различать UTF-16LE и UTF-16BE, поскольку символа U+FFFE не существует.
| Кодирование | Представление (Шестнадцатеричное) |
|---|---|
| UTF-8 | EF BB BF |
| UTF-16 (BE) | FE FF |
| UTF-16 (LE) | FF FE |
| UTF-32 (BE) | 00 00 FE FF |
| UTF-32 (LE) | FF FE 00 00 |
В кодировке UTF-8, наличие BOM не является существенным, поскольку, нет альтернативной последовательности байт. Когда BOM используется на страницах или редакторах для контента закодированного в UTF-8, иногда он может представить пробелы или короткие последовательности символов, имеющие странный вид (такие как ). Именно поэтому, при наличии выбора, для совместимости, как правило, лучше упустить BOM в UTF-8 контенте.Однако BOM могут еще встречаться в тексте закодированном в UTF-8, как побочный продукт перекодирования или потому, что он был добавлен редактором. В этом случае BOM часто называют подписью UTF-8.
Когда символ закодирован в UTF-16, его [math]2[/math] или [math]4[/math] байта можно упорядочить двумя разными способами (little-endian или big-endian). Изображение справа показывает это. Byte order mark указывает, какой порядок используется, так что приложения могут немедленно расшифровать контент. UTF-16 контент должен всегда начинатся с BOM.
BOM также используется для текста обозначенного как UTF-32. Аналогично UTF-16 существует два варианта четырёхбайтной кодировки — UTF-32BE и UTF-32LE. К сожалению, этот способ не позволяет надёжно различать UTF-16LE и UTF-32LE, поскольку символ U+0000 допускается Юникодом
Проблемы Юникода [ править ]
В Юникоде английское «a» и польское «a» — один и тот же символ. Точно так же одним символом (но отличающимся от «a» латинского) считаются русское «а» и сербское «а». Такой принцип кодирования не универсален; по-видимому, решения «на все случаи жизни» вообще не может существовать.

