Изменения

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

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

195 байт убрано, 17:52, 29 ноября 2014
Нет описания правки
== Представление символов в вычислительных машинах ==
В вычислительных машинах символы не могут храниться иначе, как в виде последовательностей бит битов (как и числа). Для передачи символа и его корректного отображения ему должна соответствовать уникальная последовательность нулей и единиц. Для этого были разработаны таблицы кодировок.
Количество символов, которые можно задать последовательностью бит битов длины <tex>n</tex>, задается простой формулой <tex>C(n) = 2^n</tex>. Таким образом, от нужного количества символов напрямую зависит количество используемой памяти.
== Таблицы кодировок ==
С ростом производительности компьютеров стали появляться таблицы кодировок с большим количеством символов.
Первой <tex>7</tex>-ми битной семибитной кодировкой стала ASCII7. В нее уже вошли прописные буквы английского алфавита, арабские цифры, знаки препинания.
Затем на ее базе была разработана ASCII8, в которым уже стало возможным хранение <tex>256</tex> символов: <tex>128</tex> основных и еще столько же расширенных. Первая часть таблицы осталась без изменений, а вторая может иметь различные варианты (каждый имеет свой номер). Эта часть таблицы стала заполняться символами национальных алфавитов.
|-
! 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
| FF || CR || SO || SI
|-
! 1.
| DLE || DC1 || DC2 || DC3
| DC4 || NAK || SYN || ETB
| FS || GS || RS || US
|-
! 2.
| &nbsp; || ! || " || #
| $ || % || & || '
| , || - || . || /
|-
! 3.
| 0 || 1 || 2 || 3
| 4 || 5 || 6 || 7
| &lt; || = || &gt; || ?
|-
! 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
==Кодировки стандарта UNICODE==
'''Юникод''' или '''Уникод''' (англ. ''Unicode'') {{---}} это промышленный стандарт, обеспечивающий цифровое представление символов всех письменностей мира , и специальных символов.
Стандарт предложен в 1991 году некоммерческой организацией «Консорциум Юникода» (англ. ''Unicode Consortium, Unicode Inc.''). Применение этого стандарта позволяет закодировать очень большое число символов из разных письменностей.
===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.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>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-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>
* [[Представление вещественных чисел]]
== Ссылки Источники информации ==
* [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]
48
правок

Навигация