1632
правки
Изменения
м
rollbackEdits.php mass rollback
В вычислительных машинах символы не могут храниться иначе, как в виде последовательностей бит (как и числа). Для передачи символа и его корректного отображения ему должна соответствовать уникальная последовательность нулей и единиц. Для этого были разработаны таблицы кодировок.
Количество символов, которые можно задать последовательностью битов бит длины <tex>n</tex>, задается простой формулой <tex>C(n) = 2^n</tex>. Таким образом, от нужного количества символов напрямую зависит количество используемой памяти.
== Таблицы кодировок ==
На заре компьютерной эры на каждый символ было отведено по пять бит. Это было связано с малым количеством оперативной памяти на компьютерах тех лет. В эти <tex>6432</tex> символа входили только управляющие символы и строчные буквы английского алфавита.
С ростом производительности компьютеров стали появляться таблицы кодировок с большим количеством символов.
Первой <tex>7</tex>-ми битной семибитной кодировкой стала ASCII7. В нее уже вошли прописные буквы английского алфавита, арабские цифры, знаки препинания.
Затем на ее базе была разработана ASCII8, в которым уже стало возможным хранение <tex>256</tex> символов: <tex>128</tex> основных и еще столько же расширенных. Первая часть таблицы осталась без изменений, а вторая может иметь различные варианты (каждый имеет свой номер). Эта часть таблицы стала заполняться символами национальных алфавитов.
Но для многих языков (например, арабского, японского, китайского) <tex>256</tex> символов недостаточно, поэтому развитие кодировок продолжалось, что привело к появлению UNICODE.
==Кодировки стандарта ASCII==
{{Определение
'''<tex>7</tex> бит:'''
* '''ASCII7''' {{- --}} первая кодировка, пригодная для работы с текстом. Помимо маленьких букв английского алфавита и служебных символов, содержит большие буквы английского языка, цифры, знаки препинания и другие символы.
'''Кодировки стандарта 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> к каждому двоично-десятичному полубайту.
|-
! width="4%" |
! 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
| FF || CR || SO || SI
|-
! 1.
| DLE || DC1 || DC2 || DC3
| DC4 || NAK || SYN || ETB
| FS || GS || RS || US
|-
! 2.
| || ! || " || #
| $ || % || & || '
| , || - || . || /
|-
! 3.
| 0 || 1 || 2 || 3
| 4 || 5 || 6 || 7
| < || = || > || ?
|-
! 4.
| @ || A || B || C
| D || E || F || G
| L || M || N || O
|-
! 5.
| P || Q || R || S
| T || U || V || W
| \ || ] || ^ || _
|-
! 6.
| ` || a || b || c
| d || e || f || g
| l || m || n || o
|-
! 7.
| p || q || r || s
| t || u || v || w
===UTF-8===
UTF-8 {{---}} представление Юникода, обеспечивающее наилучшую совместимость со старыми системами, использовавшими <tex>8</tex>-битные символы. Текст, состоящий только из символов с номером меньше <tex>128</tex>, при записи в UTF-8 превращается в обычный текст ASCII. И наоборот, в тексте UTF-8 любой байт со значением меньше <tex>128</tex> изображает символ ASCII с тем же кодом. Остальные символы Юникода изображаются последовательностями длиной от двух до шести байт (на деле, только до четырех байт, поскольку в Юникоде нет символов с кодом больше <tex>10FFFF_{16}</tex>, и вводить их в будущем не планируется), в которых первый байт всегда имеет вид <tex>11xxxxxx</tex>, а остальные — <tex>10xxxxxx</tex>. В UTF-8 не используются суррогатные пары, четырех байт достаточно для записи любого символа юникода.
Символы UTF-8 получаются из Unicode cледующим образом:
2. Если размер символа в кодировке в UTF-8 <tex>> 1</tex> байт (то есть от <tex>2</tex> до <tex>6</tex>):
: 2.1 Первый байт содержит количество байтов байт символа, закодированное в '''единичной''' системе счисления;
2 — 11
: 2.2 «0» — бит терминатор, означающий завершение кода размера
: 2.3 далее идут значащие байты кода, которые имеют вид (10xx xxxx), где «10» — биты признака продолжения, а x — «x» — значащие биты.
В общем случае варианты представления '''одного символа''' в кодировке UTF-8 выглядят так:
| <center><tex>1</tex></center> || <center><tex>7</tex></center>
|-
| <center><tex>2</tex></center> || <center><tex>^{+4} 11</tex></center>
|-
| <center><tex>3</tex></center> || <center><tex>^{+5} 16</tex></center>
|-
| <center><tex>4</tex></center> || <center><tex>^{+5} 21</tex></center>
|-
| <center><tex>5</tex></center> || <center><tex>^{+5} 26</tex></center>
|-
| <center><tex>6</tex></center> || <center><tex>^{+5} 31</tex></center>
|}
<tex>C = 7</tex> при <tex>n=1</tex>
<tex>C = n*5\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>42</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_FFFFF_{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.
=====Порядок от младшего к старшему=====
=====Переключаемый порядок=====
Многие процессоры могут работать и в порядке от младшего к старшему, и в обратном, например, 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>-хбайтное двойное слово записывалось от старшего слова к младшему.
Существенным достоинством 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"
|-
|}
В кодировке 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.
|}
==Смотри См. также==
* [[Представление целых чисел: прямой код, код со сдвигом, дополнительный код]]
* [[Представление вещественных чисел]]
== Ссылки Источники информации ==
* [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]