Изменения

Перейти к: навигация, поиск

Представление символов, таблицы кодировок

30 073 байта добавлено, 14:34, 7 апреля 2015
м
Смотри также
== Представление символов в вычислительных машинах ==
В вычислительных машинах символы не могут храниться иначе, как в виде последовательностей битов бит (как и числа). Для передачи символа и его корректного отображения ему должна соответствовать уникальная последовательность нулей и единиц. Для этого были разработаны таблицы кодировок.
Количество символов, которые можно задать последовательностью битов бит длины ''<tex>n''</tex>, задается простой формулой <tex>C(n) = 2^n</tex>. Таким образом, от нужного количества символов напрямую зависит количество используемой памяти.
== Таблицы кодировок ==
На заре компьютерной эры на каждый символ было отведено по 5 пять бит. Это было связано с малым количеством оперативной памяти на компьютерах тех лет. В эти <tex>64 </tex> символа входили только управляющие символы и строчные буквы английского алфавита.
С ростом производительности компьютеров стали появляться таблицы кодировок с большим количеством символов.
Первой 7 битной семибитной кодировкой стала ASCII7. В нее уже вошли прописные буквы английского алфавита, арабские цифры, знаки препинания.Затем на ее базе была разработана ASCII8, в которым уже стало возможным хранение <tex>256 </tex> символов: <tex>128 </tex> основных и еще столько же расширенных. Первая часть таблицы осталась без изменений, а вторая может иметь различные варианты (каждый имеет свой номер). Эта часть таблицы стала заполняться символами национальных алфавитов.
Но для многих языков (например, арабского, японского, китайского) <tex>256</tex> символов недостаточно, поэтому развитие кодировок продолжалось, что привело к появлению UNICODE.
==Кодировки стандарта ASCII==
{{Определение
|definition='''ASCII ''' {{- --}} таблицы кодировок, в которых содержатся основные символы (английский алфавит, цифры, знаки препинания, символы национальных алфавитов(свои для каждого региона), служебные символы) и длина кода каждого символа <tex>n = 8</tex> бит.
}}
Но '''<tex>7</tex> бит:'''* '''ASCII7''' {{---}} первая кодировка, пригодная для многих языков (напримерработы с текстом. Помимо маленьких букв английского алфавита и служебных символов, арабского, японского, китайского) 256 символов недостаточносодержит большие буквы английского языка, поэтому развитие кодировок продолжалосьцифры, что привело к появлению UNICODEзнаки препинания и другие символы.
'''Кодировки стандарта ASCII (<tex>8</tex> бит):'''* '''ASCII''' {{---}} первая кодировка, в которой стало возможно использовать символы национальных алфавитов.* '''КОИ8-R''' {{---}} первая русская кодировка. Символы кириллицы расположены не в алфавитном порядке. Их разместили в верхнюю половину таблицы так, чтобы позиции кириллических символов соответствовали их фонетическим аналогам в английском алфавите. Это значит, что даже при потере старшего бита каждого символа, например, при проходе через устаревший семибитный модем, текст остается "читаемым".* '''CP866''' {{---}} русская кодировка, использовавшаяся на компьютерах IBM в системе DOS.* '''Windows-1251''' {{---}} русская кодировка, использовавшаяся в русскоязычных версиях операционной системы Windows в начале 90-х годов. Кириллические символы идут в алфавитном порядке. Содержит все символы, встречающиеся в типографике обычного текста (кроме знака ударения).===Структурные свойства таблицы===* Цифры 0-9 представляются своими двоичными значениями (например, <tex>5=0101_2</tex>), перед которыми стоит <tex>0011_2</tex>. Таким образом, двоично-десятичные числа (BCD) превращаются в ASCII-строку с помощью простого добавления слева <tex>0011_2</tex> к каждому двоично-десятичному полубайту.* Буквы A-Z верхнего и нижнего регистров различаются в своём представлении только одним битом, что упрощает преобразование регистра и проверку на диапазон. Буквы представляются своими порядковыми номерами в алфавите, записанными в двоичной системе счисления, перед которыми стоит <tex>0100_2</tex> (для букв верхнего регистра) или <tex>0110_2</tex> (для букв нижнего регистра). {Определение| border="1" cellspacing="0" style="text-align: center; font-family: monospace" |- ! width="4%" | &nbsp; ! width="6%" | 0 || width="6%" | 1 ! width="6%" | 2 || width="6%" | 3 ! width="6%" | 4 || width="6%" | 5 ! width="6%" | 6 || width="6%" | 7 ! width="6%" | 8 || width="6%" | 9 ! width="6%" | A || width="6%" | B ! width="6%" | C || width="6%" | D ! width="6%" | E || width="6%" | F |- ! 0 | NUL || SOH || STX || ETX | EOT || ENQ || ACK || BEL | BS || TAB || LF || VT | FF || CR || SO || SI |- ! 1 | DLE || DC1 || DC2 || DC3 | DC4 || NAK || SYN || ETB | CAN || EM || SUB || ESC | FS || GS || RS || US |- ! 2 | &nbsp; || ! || " || # | $ || % || & || ' | ( || ) || * || + | , || - || . || / |- ! 3 | 0 || 1 || 2 || 3 | 4 || 5 || 6 || 7 | 8 || 9 || : || ; | &lt; ||definition=|| &gt; || ? |- ! 4 | @ || A || B || C | D || E || F || G | H || I || J || K | L || M || N || O |- ! 5 | P || Q || R || S | T || U || V || W | X || Y || Z || [ | \ || ] || ^ || _ |- ! 6 | ` || a || b || c | d || e || f || g | h || i || j || k | l || m || n || o |- ! 7 | p || q || r || s | t || u || v || w | x || y || z || { | &#124; || } || ~ || DEL |} ==Кодировки стандарта 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 позволяют кодировать до <tex>2^{31}</tex> <tex>(2\ 147\ 483\ 648)</tex> кодовых позиций, было принято решение использовать лишь <tex>1\ 112\ 064</tex> для совместимости с UTF-16. Впрочем, даже и этого на текущий момент более чем достаточно — в версии 6.0 используется чуть менее <tex>110\ 000</tex> кодовых позиций (<tex>109\ 242</tex> графических и <tex>273</tex> прочих символов). Кодовое пространство разбито на <tex>17</tex> плоскостей (англ. ''planes'') по <tex>2^{16}</tex> <tex>n (65\geq 8536)</tex> символов. Нулевая плоскость называется базовой, в ней расположены символы наиболее употребительных письменностей. Первая плоскость используется, в основном, для исторических письменностей, вторая {{---}} для для редко используемых иероглифов китайского письма, третья зарезервирована для архаичных китайских иероглифов. Плоскости <tex>15</tex> и <tex>16</tex> выделены для частного употребления. Для обозначения символов Unicode используется запись вида «U+xxxx» (для кодов <tex>0000_{16}..FFFF_{16}</tex>) или «U+xxxxx» (для кодов <tex>10000_{16}..FFFFF_{16}</tex>) или «U+xxxxxx» (для кодов <tex>100000_{16}..10FFFF_{16}</tex>), где xxx — шестнадцатеричные цифры. Например, символ «я» (U+044F) имеет код <tex>044F_{16} = 1103_{10}</tex> бит{| class="wikitable sortable collapsible collapsed"|-! colspan="3" | Плоскости Юникода|-! Плоскость !! Название !! Диапазон символов|-| 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 || Supplement­ary special-purpose plane (SSP) || U+E0000…U+​EFFFF|-| Planes 15-16 || Supplement­ary private use area (S PUA A/B) || U+F0000…U+​10FFFF|-|} ===Модифицирующие символы===[[Файл:Ji.png|thumb|right| 250px]]Графические символы в Юникоде делятся на протяжённые и непротяжённые. Непротяжённые символы при отображении не занимают дополнительного места в строке. К примеру, к ним относятся знак ударения. Протяжённые и непротяжённые символы имеют собственные коды, но последние не могут встречаться самостоятельно. Протяжённые символы называются базовыми (англ. ''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 она не получила распространения и не включена в стандарт.
''7 бит:''===UTF-8===* '''ASCII7''' UTF- первая кодировка, пригодная для работы с текстом. Помимо маленьких букв английского алфавита и служебных символов8 {{---}} представление Юникода, содержит большие буквы английского языкаобеспечивающее наилучшую совместимость со старыми системами, цифры, знаки препинания и другие символы.''Кодировки стандарта ASCII (использовавшими <tex>8 бит):''* '''ASCII''' </tex>- первая кодировка, в которой стало возможно использовать битные символы национальных алфавитов.* '''КОИ8-R''' - первая русская кодировка. Символы кириллицы расположены не в алфавитном порядке. Их разместили в верхнюю половину таблицы такТекст, чтобы позиции кириллических состоящий только из символов соответствовали их фонетическим аналогам в английском алфавите. Это значитс номером меньше <tex>128</tex>, что даже при потере старшего бита каждого символа, например, при проходе через устаревший семибитный модем, текст остается "читаемым".* '''CP866''' записи в UTF- русская кодировка, использовавшаяся на компьютерах IBM 8 превращается в системе DOSобычный текст ASCII.* '''Windows-1251''' - русская кодировкаИ наоборот, использовавшаяся в русскоязычных версиях операционной системы Windows в начале 90тексте UTF-х годов8 любой байт со значением меньше <tex>128</tex> изображает символ ASCII с тем же кодом. Кириллические Остальные символы идут Юникода изображаются последовательностями длиной от двух до шести байт (на деле, только до четырех байт, поскольку в алфавитном порядке. Содержит все символыЮникоде нет символов с кодом больше <tex>10FFFF_{16}</tex>, встречающиеся и вводить их в типографике обычного текста (кроме знака ударениябудущем не планируется).[http://ru.wikipedia.org/wiki/CP1251]''Кодировки стандарта UNICODE:''* '''UTF8''' - самая распространенная на данный момент кодировка из семейства UNICODE. [http:, в которых первый байт всегда имеет вид <tex>11xxxxxx</tex>, а остальные — <tex>10xxxxxx</ru.wikipediatex>.org/wiki/UTF-8]
Символы UTF-8 получаются из Unicode cледующим образом:{|class="standardwikitable"
!Unicode||UTF-8||Представленные символы
|-
|||<code>111111xx</code>||служебные символы c, d, e, f
|}
Несмотря на то, что UTF-8 позволяет указать один и тот же символ несколькими способами, только наиболее короткий из них правильный. Остальные формы, называемые overlong sequence, отвергаются по соображениям безопасности.
Также возможны коды длиной ====Принцип кодирования=========Правила записи кода одного символа в 5 и 6 байт, но на практике они не используютсяUTF-8=====1. Это связано с тем, что Если размер символа в стандарт Unicode не входят символы с кодом выше кодировке UTF-8 = <tex>1<code/tex>0x10ffffбайт<br /code>.
==BOM==: Код имеет вид (0aaa aaaa), где «0» — просто ноль, остальные биты «a» — это код символа в кодировке ASCII;
2. Если размер символа в кодировке в UTF-8 <tex>> 1</tex> байт (то есть от <tex>2</tex> до <tex>6</tex>):
: 2.1 Первый байт содержит количество байт символа, закодированное в '''единичной''' системе счисления;
'''Byte Order Mark (BOM)''' - Unicode символ, используемый для индикации порядка байтов (порядка байт) текстового файла. Его кодовый символ U+FEFF. По спецификации его использование не является обязательным, однако если BOM используется, то он должен быть установлен вначале текстового файла. Помимо своего конкретного использования в качестве указателя порядка байтов, символ может также указать какой кодировкой Unicode закодирован текст. 2 — 11 3 — 111 4 — 1111 5 — 1111 1 6 — 1111 11
Кодировка Unicode может использовать 16-битные или 32-разрядных числа и приложение должно знать как дальше с ним поступать. Поэтому потребность в BOM возникает при обмене документами: 2.2 «0» — бит терминатор, означающий завершение кода размера
== Использование ==В потоке данных UTF-16 старший байт может записываться либо перед младшим (англ: 2. UTF-16 big-endian)3 далее идут значащие байты кода, либо после младшего которые имеют вид (англ. UTF-16 little-endian10xx xxxx). Аналогично существует два варианта четырёхбайтной кодировки — UTF-32BE и UTF-32LE, где «10» — биты признака продолжения, а «x» — значащие биты.
Для определения формата В общем случае варианты представления Юникода '''одного символа''' в текстовом файле используется приём, по которому в начале текста записывается символ U+FEFF кодировке UTF-8 выглядят так: (1 байт) 0aaa aaaa (2 байта) 110x xxxx 10xx xxxx (3 байта) 1110 xxxx 10xx xxxx 10xx xxxx (4 байта) 1111 0xxx 10xx xxxx 10xx xxxx 10xx xxxx (неразрывный пробел с нулевой шириной5 байт), также именуемый меткой порядка байтов 1111 10xx 10xx xxxx 10xx xxxx 10xx xxxx 10xx xxxx (англ. byte order mark, BOM6 байт). Этот способ позволяет различать UTF-16LE и UTF-16BE, поскольку символа U+FFFE не существует. Также он иногда применяется для обозначения формата 1111 110x 10xx xxxx 10xx xxxx 10xx xxxx 10xx xxxx 10xx xxxx =====Определение длины кода в UTF-8, хотя к этому формату и неприменимо понятие порядка байтов.== Представление кодировки Byte order marks ===
{| class="wikitable"
|-
! Количество байт UTF-8 !! Количество значащих бит
|-
| <center><tex>1</tex></center> || <center><tex>7</tex></center>
|-
| <center><tex>2</tex></center> || <center><tex>11</tex></center>
|-
| <center><tex>3</tex></center> || <center><tex>16</tex></center>
|-
| <center><tex>4</tex></center> || <center><tex>21</tex></center>
|-
| <center><tex>5</tex></center> || <center><tex>26</tex></center>
|-
| <center><tex>6</tex></center> || <center><tex>31</tex></center>
|}
 
В общем случае количество значащих бит <tex>C</tex>, кодируемых <tex>n</tex> байтами UTF-8, определяется по формуле:
 
<tex>C = 7</tex> при <tex>n=1</tex>
 
<tex>C = n\cdot5+1</tex> при <tex>n>1</tex>
 
===UTF-16===
UTF-16 {{---}} один из способов кодирования '''символов''' (англ. ''code point'') из Unicode в виде последовательности <tex>16</tex>-битных '''слов''' (англ. ''code unit''). Данная кодировка позволяет записывать символы Юникода в диапазонах U+0000..U+D7FF и U+E000..U+10FFFF (общим количеством <tex>1\ 112\ 064</tex>), причем <tex>4</tex>-байтные символы представляются как есть, а более длинные {{---}} с помощью суррогатных пар (англ. ''surrogate pair''), для которых и вырезан диапазон <tex>D800_{16}..DFFF_{16}</tex>.
 
В UTF-16 символы кодируются двухбайтовыми словами с использованием всех возможных диапазонов значений (от <tex>0000_{16}</tex> до <tex>FFFF_{16}</tex>). При этом можно кодировать символы Unicode в дипазонах <tex>0000_{16}..D7FF_{16}</tex> и <tex>E000_{16}..10FFFF_{16}</tex>. Исключенный отсюда диапазон <tex>D800_{16}..DFFF_{16}</tex> используется как раз для кодирования так называемых суррогатных пар — символов, которые кодируются двумя <tex>16</tex>-битными словами. Символы Unicode до <tex>FFFF_{16}</tex> включительно (исключая диапазон для суррогатов) записываются как есть <tex>16</tex>-битным словом. Символы же в диапазоне <tex>10000_{16}..10FFFF_{16}</tex> (больше <tex>16</tex> бит) уже кодируются парой <tex>16</tex>-битных слов. Для этого их код арифметически сдвигается до нуля (из него вычитается минимальное число <tex>10000_{16}</tex>). В результате получится значение от нуля до <tex>FFFF_{16}</tex>, которое занимает до <tex>20</tex> бит. Старшие <tex>10</tex> бит этого значения идут в лидирующее (первое) слово, а младшие <tex>10</tex> бит — в последующее (второе). При этом в обоих словах старшие <tex>6</tex> бит используются для обозначения суррогата. Биты с <tex>11</tex> по <tex>15</tex> имеют значения <tex>11011_2</tex>, а <tex>10</tex>-й бит содержит <tex>0</tex> у лидирующего слова и <tex>1</tex> — у последующего. В связи с этим можно легко определить к чему относится каждое слово.
 
====UTF-16LE и UTF-16BE====
Один символ кодировки UTF-16 представлен последовательностью двух байт или двух пар байт. Который из двух идёт впереди, старший или младший, зависит от порядка байт. Подробнее об этом будет сказано ниже.
 
===UTF-32===
UTF-32 {{---}} один из способов кодирования символов из Юникод, использующий для кодирования любого символа ровно <tex>32</tex> бита. Остальные кодировки, UTF-8 и UTF-16, используют для представления символов переменное число байт. Символ UTF-32 является прямым представлением его кодовой позиции (англ. ''code point'').
 
Главное преимущество UTF-32 перед кодировками переменной длины заключается в том, что символы Юникод непосредственно индексируемы. Получение <tex>n</tex>-ой кодовой позиции является операцией, занимающей одинаковое время. Напротив, коды с переменной длиной требует последовательного доступа к <tex>n</tex>-ой кодовой позиции. Это делает замену символов в строках UTF-32 простой, для этого используется целое число в качестве индекса, как обычно делается для строк ASCII.
 
Главный недостаток UTF-32 {{---}} это неэффективное использование пространства, так как для хранения символа используется четыре байта. Символы, лежащие за пределами нулевой (базовой) плоскости кодового пространства редко используются в большинстве текстов. Поэтому удвоение, в сравнении с UTF-16, занимаемого строками в UTF-32 пространства не оправдано.
 
Хотя использование неменяющегося числа байт на символ удобно, но не настолько, как кажется. Операция усечения строк реализуется легче в сравнении с UTF-8 и UTF-16. Но это не делает более быстрым нахождение конкретного смещения в строке, так как смещение может вычисляться и для кодировок фиксированного размера. Это не облегчает вычисление отображаемой ширины строки, за исключением ограниченного числа случаев, так как даже символ «фиксированной ширины» может быть получен комбинированием обычного символа с модифицирующим, который не имеет ширины. Например, буква «й» может быть получена из буквы «и» и диакритического знака «крючок над буквой». Сочетание таких знаков означает, что текстовые редакторы не могут рассматривать <tex>32</tex>-битный код как единицу редактирования. Редакторы, которые ограничиваются работой с языками с письмом слева направо и составными символами (англ. ''Precomposed character''), могут использовать символы фиксированного размера. Но такие редакторы вряд ли поддержат символы, лежащие за пределами нулевой (базовой) плоскости кодового пространства и вряд ли смогут работать одинаково хорошо с символами UTF-16.
 
===Порядок байт===
В современной вычислительной технике и цифровых системах связи информация обычно представлена в виде последовательности байт. В том случае, если число не может быть представлено одним байтом, имеет значение в каком порядке байты записываются в памяти компьютера или передаются по линиям связи. Часто выбор порядка записи байт произволен и определяется только соглашениями.
 
В общем случае, для представления числа <tex>M</tex>, большего <tex>255</tex> (здесь <tex>255=2^8-1</tex> — максимальное целое число, записываемое одним байтом), приходится использовать несколько байт. При этом число <tex>M</tex> записывается в позиционной системе счисления по основанию <tex>256</tex>:
 
<tex>M = \sum_{i=0}^{n}A_i\cdot 256^i=A_0\cdot 256^0+A_1\cdot 256^1+A_2\cdot 256^2+\dots+A_n\cdot 256^n.</tex>
 
Набор целых чисел <tex>A_0,\dots,A_n</tex>, каждое из которых лежит в интервале от <tex>0</tex> до <tex>255</tex>, является последовательностью байт, составляющих <tex>M</tex>. При этом <tex>A_0</tex> называется младшим байтом, а <tex>A_n</tex> — старшим байтом числа <tex>M</tex>.
 
====Варианты записи====
=====Порядок от старшего к младшему=====
Порядок от старшего к младшему (англ. ''big-endian''): <tex>A_n,\dots,A_0</tex>, запись начинается со старшего и заканчивается младшим. Этот порядок является стандартным для протоколов TCP/IP, он используется в заголовках пакетов данных и во многих протоколах более высокого уровня, разработанных для использования поверх TCP/IP. Поэтому, порядок байт от старшего к младшему часто называют сетевым порядком байт (англ. ''network byte order''). Этот порядок байт используется процессорами IBM 360/370/390, Motorola 68000, SPARC (отсюда третье название — порядок байт Motorola, Motorola byte order).
 
В этом же виде (используя представление в десятичной системе счисления) записываются числа индийско-арабскими цифрами в письменностях с порядком знаков слева направо (латиница, кириллица). Для письменностей с обратным порядком (арабская) та же запись числа воспринимается как «от младшего к старшему».
 
Порядок байт от старшего к младшему применяется во многих форматах файлов — например, PNG, FLV, EBML.
 
=====Порядок от младшего к старшему=====
Порядок от младшего к старшему (англ. ''little-endian''): <tex>A_0,\dots,A_n</tex>, запись начинается с младшего и заканчивается старшим. Этот порядок записи принят в памяти персональных компьютеров с x86-процессорами, в связи с чем иногда его называют интеловский порядок байт (по названию фирмы-создателя архитектуры x86).
 
В противоположность порядку big-endian, соглашение little-endian поддерживают меньше кросс-платформенных протоколов и форматов данных; существенные исключения: USB, конфигурация PCI, таблица разделов GUID, рекомендации FidoNet.
 
=====Переключаемый порядок=====
Многие процессоры могут работать и в порядке от младшего к старшему, и в обратном, например, ARM, PowerPC (но не PowerPC 970), DEC Alpha, MIPS, PA-RISC и IA-64. Обычно порядок байт выбирается программно во время инициализации операционной системы, но может быть выбран и аппаратно перемычками на материнской плате. В этом случае правильнее говорить о порядке байт операционной системы. Переключаемый порядок байт иногда называют англ. ''bi-endian''.
 
=====Смешанный порядок=====
Смешанный порядок байт (англ. ''middle-endian'') иногда используется при работе с числами, длина которых превышает машинное слово. Число представляется последовательностью машинных слов, которые записываются в формате, естественном для данной архитектуры, но сами слова следуют в обратном порядке.
 
Классический пример middle-endian — представление <tex>4</tex>-байтных целых чисел на <tex>16</tex>-битных процессорах семейства PDP-11 (известен как PDP-endian). Для представления двухбайтных значений (слов) использовался порядок little-endian, но <tex>4</tex>-хбайтное двойное слово записывалось от старшего слова к младшему.
 
В процессорах VAX и ARM используется смешанное представление для длинных вещественных чисел.
 
=====Различия=====
[[Файл:endian.png|thumb|right| 300px]]
Существенным достоинством little-endian по сравнению с big-endian порядком записи считается возможность «неявной типизации» целых чисел при чтении меньшего объёма байт (при условии, что читаемое число помещается в диапазон). Так, если в ячейке памяти содержится число <tex>00000022_{16}</tex>, то прочитав его как int16 (два байта) мы получим число <tex>0022_{16}</tex>, прочитав один байт — число <tex>22_{16}</tex>. Однако, это же может считаться и недостатком, потому что провоцирует ошибки потери данных.
 
Обратно, считается что у little-endian, по сравнению с big-endian есть «неочевидность» значения байт памяти при отладке (последовательность байт (A1, B2, C3, D4) на самом деле значит <tex>D4C3B2A1_{16}</tex>, для big-endian эта последовательность (A1, B2, C3, D4) читалась бы «естественным» для арабской записи чисел образом: <tex>A1B2C3D4_{16}</tex>). Наименее удобным в работе считается middle-endian формат записи; он сохранился только на старых платформах.
 
Для записи длинных чисел (чисел, длина которых существенно превышает разрядность машины) обычно предпочтительнее порядок слов в числе little-endian (поскольку арифметические операции над длинными числами производятся от младших разрядов к старшим). Порядок байт в слове — обычный для данной архитектуры.
 
====Маркер последовательности байт====
Для определения формата представления Юникода в начало текстового файла записывается сигнатура — символ U+FEFF (неразрывный пробел с нулевой шириной), также именуемый маркером последовательности байт (англ. ''byte order mark (BOM)''). Это позволяет различать UTF-16LE и UTF-16BE, поскольку символа U+FFFE не существует.
[[Файл:Bom.png|thumb|right| 400px]]
{| class="wikitable"
|+'''Представление BOM в кодировках'''
|-
! Кодирование
! Представление (Шестнадцатеричная)! Представление (Десятичная)! Представление (ISO-8859-1Шестнадцатеричное)
|-
| UTF-8
| <code>EF BB BF</code>
| <code>239 187 191</code>
| <code></code>
|-
| UTF-16 (Big Endian|BE)
| <code>FE FF</code>
| <code>254 255</code>
| <code>þÿ</code>
|-
| UTF-16 (Little Endian|LE)
| <code>FF FE</code>
| <code>255 254</code>
| <code>ÿþ</code>
|-
| UTF-32 (BE)
| <code>00 00 FE FF</code>
| <code>0 0 254 255</code>
| <code>□□þÿ</code> (□ ASCII символ нуль)
|-
| UTF-32 (LE)
| <code>FF FE 00 00</code>
| <code>255 254 0 0</code>
| <code>ÿþ□□</code> (□ ASCII символ нуль)
|-
| UTF-7
| <code>2B 2F 76 38<br>2B 2F 76 39<br>2B 2F 76 2B<br>2B 2F 76 2F</code>
| <code>43 47 118 56<br>43 47 118 57<br>43 47 118 43<br>43 47 118 47</code>
| <code>+/v8<br>+/v9<br>+/v+<br>+/v/</code>
|-
| UTF-1
| <code>F7 64 4C</code>
| <code>247 100 76</code>
| <code>÷dL</code>
|-
| UTF-EBCDIC
| <code>DD 73 66 73</code>
| <code>221 115 102 115</code>
| <code>Ýsfs</code>
|-
| Standard Compression Scheme for Unicode|SCSU
| <code>0E FE FF</code>
| <code>14 254 255</code>
| <code>□þÿ</code> (□ ASCII "shift out" символ)
|-
| BOCU-1
| <code>FB EE 28
| <code>251 238 40</code>
| <code>ûî</code>
|-
| GB-18030
| <code>84 31 95 33</code>
| <code>132 49 149 51</code>
| <code>□1■3</code> (□ и ■ несопоставленные ISO-8859-1 символы)
|}
В кодировке UTF-8, наличие BOM не является существенным, поскольку, нет альтернативной последовательности байт. Когда BOM используется на страницах или редакторах для контента закодированного в UTF-8, иногда он может представить пробелы или короткие последовательности символов, имеющие странный вид (такие как ). Именно поэтому, при наличии выбора, для совместимости, как правило, лучше упустить BOM в UTF-8 контенте.Однако BOM могут еще встречаться в тексте закодированном в UTF-8, как побочный продукт перекодирования или потому, что он был добавлен редактором. В этом случае BOM часто называют подписью UTF-8. Когда символ закодирован в UTF-16, его <tex>2</tex> или <tex>4</tex> байта можно упорядочить двумя разными способами (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» латинского) считаются русское «а» и сербское «а». Такой принцип кодирования не универсален; по-видимому, решения «на все случаи жизни» вообще не может существовать. ==Примеры==Если записать строку 'hello мир' в файл exampleBOM, а затем сделать его hex-дамп, то можно убедиться в том, что разные символы кодируются разным количеством байт. Например, английские буквы,пробел, знаки препинания и пр. кодируются одним байтом, а русские буквы - двумя===Код на python===<pre>#!/usr/bin/env python#coding:utf-8import codecsf = open('exampleBOM','w')b = u'hello мир'f.write(codecs.BOM_UTF8)f.write(b.encode('utf-8'))f.close()</pre>===hex-дамп файла exampleBOM==={|class = "wikitable" border = "1" style="text-align:center" |Символ |colspan="3" |BOM |h||e||l||l||o |Пробел |colspan="2" |м |colspan="2" |и |colspan="2" |р |- |Код в UNICODE |EF |BB |BF |68||65||6C||6C||6F |20||D0||BC||D0||B8||D1||80 |- |Код в UTF-8 |11101111||10111011||10111111 |01101000||01100101||01101100||01101100||01101111 |00100000||11010000||10111100||11010000||10111000||11010001||10000000 |} ==См. также==* [[Представление целых чисел: прямой код, код со сдвигом, дополнительный код]]* [[Представление вещественных чисел]] == Источники информации ==* [http://ru.wikipedia.org/wiki/ASCII Wikipedia {{---}} таблица ASCII]* [http://ru.wikipedia.org/wiki/%D0%AE%D0%BD%D0%B8%D0%BA%D0%BE%D0%B4 Wikipedia {{---}} стандарт UNICODE]* [http://ru.wikipedia.org/wiki/Byte_order_mark Wikipedia {{---}} Byte order mark]* [http://ru.wikipedia.org/wiki/Порядок_байтов Wikipedia {{---}} Порядок байтов]* [http://ru.wikipedia.org/wiki/%D0%AE%D0%BD%D0%B8%D0%BA%D0%BE%D0%B4 Wikipedia {{---}} Юникод] * [http://ru.wikipedia.org/wiki/CP1251 Wikipedia {{---}} Windows-1251]* [http://ru.wikipedia.org/wiki/UTF-8 Wikipedia {{---}} UTF-8]* [http://ru.wikipedia.org/wiki/UTF-16 Wikipedia {{---}} UTF-16]* [http://ru.wikipedia.org/wiki/UTF-32 Wikipedia {{---}} UTF-32]
== Ссылки ==
* [http://ru.wikipedia.org/wiki/ASCII Wikipedia: таблица ASCII]
* [http://ru.wikipedia.org/wiki/%D0%AE%D0%BD%D0%B8%D0%BA%D0%BE%D0%B4 Wikipedia: стандарт UNICODE]
* [http://ru.wikipedia.org/wiki/Byte_order_mark Wikipedia: Byte order mark]
* [http://ru.wikipedia.org/wiki/%D0%AE%D0%BD%D0%B8%D0%BA%D0%BE%D0%B4 Wikipedia: Юникод]
[[Категория: Дискретная математика и алгоритмы]]
[[Категория: Представление информации]]

Навигация