Изменения

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

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

84 байта убрано, 17:55, 29 ноября 2014
Нет описания правки
== Представление символов в вычислительных машинах ==
В вычислительных машинах символы не могут храниться иначе, как в виде последовательностей битов бит (как и числа). Для передачи символа и его корректного отображения ему должна соответствовать уникальная последовательность нулей и единиц. Для этого были разработаны таблицы кодировок.
Количество символов, которые можно задать последовательностью битов бит длины <tex>n</tex>, задается простой формулой <tex>C(n) = 2^n</tex>. Таким образом, от нужного количества символов напрямую зависит количество используемой памяти.
== Таблицы кодировок ==
====UTF-16LE и UTF-16BE====
Один символ кодировки 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.
48
правок

Навигация