48
правок
Изменения
Нет описания правки
== Таблицы кодировок ==
На заре компьютерной эры на каждый символ было отведено по пять бит. Это было связано с малым количеством оперативной памяти на компьютерах тех лет. В эти <tex>64 </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''' - первая русская кодировка. Символы кириллицы расположены не в алфавитном порядке. Их разместили в верхнюю половину таблицы так, чтобы позиции кириллических символов соответствовали их фонетическим аналогам в английском алфавите. Это значит, что даже при потере старшего бита каждого символа, например, при проходе через устаревший семибитный модем, текст остается "читаемым".
* '''Windows-1251''' - русская кодировка, использовавшаяся в русскоязычных версиях операционной системы Windows в начале 90-х годов. Кириллические символы идут в алфавитном порядке. Содержит все символы, встречающиеся в типографике обычного текста (кроме знака ударения).
===Структурные свойства таблицы===
* Цифры 0—9 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> (для букв нижнего регистра).
| | || } || ~ || DEL
|}
==Кодировки стандарта UNICODE==
Коды в стандарте 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> (65 \ 536) </tex> символов. Нулевая плоскость называется базовой, в ней расположены символы наиболее употребительных письменностей. Первая плоскость используется, в основном, для исторических письменностей, вторая {{---}} для для редко используемых иероглифов китайского письма, третья зарезервирована для архаичных китайских иероглифов. Плоскости <tex>15 </tex> и <tex>16 </tex> выделены для частного употребления.
Для обозначения символов Unicode используется запись вида «U+xxxx» (для кодов <tex>00000_{16}..FFFFFFFF_{16}</tex>) или «U+xxxxx» (для кодов <tex>1000010000_{16}..FFFFFFFFFF_{16}</tex>) или «U+xxxxxx» (для кодов <tex>100000100000_{16}..10FFFF10FFFF_{16}</tex>), где xxx — шестнадцатеричные цифры. Например, символ «я» (U+044F) имеет код <tex>044F_{16} = 1103_{10}</tex>.
{| class="wikitable sortable collapsible collapsed"
===UTF-8===
UTF-8 {{---}} представление Юникода, обеспечивающее наилучшую совместимость со старыми системами, использовавшими <tex>8</tex>-битные символы. Текст, состоящий только из символов с номером меньше <tex>128</tex>, при записи в UTF-8 превращается в обычный текст ASCII. И наоборот, в тексте UTF-8 любой байт со значением меньше <tex>128 </tex> изображает символ ASCII с тем же кодом. Остальные символы Юникода изображаются последовательностями длиной от 2 двух до 6 шести байт (на деле, только до 4 четырех байт, поскольку в Юникоде нет символов с кодом больше <tex>10FFFF10FFFF_{16}</tex>, и вводить их в будущем не планируется), в которых первый байт всегда имеет вид <tex>11xxxxxx</tex>, а остальные — <tex>10xxxxxx</tex>. В UTF-8 не используются суррогатные пары, 4-x байтов четырех байт достаточно для записи любого символа юникода.
Символы UTF-8 получаются из Unicode cледующим образом:
====Принцип кодирования====
=====Правила записи кода одного символа в UTF-8=====
1. Если размер символа в кодировке UTF-8 = <tex>1 </tex> байт<br />
: Код имеет вид (0aaa aaaa), где «0» — просто ноль, остальные биты «a» — это код символа в кодировке ASCII;
2. Если размер символа в кодировке в UTF-8 <tex>> 1 </tex> байт (то есть от <tex>2 </tex> до <tex>6</tex>):
: 2.1 Первый байт содержит количество байтов символа, закодированное в '''единичной''' системе счисления;
===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''), для которых и вырезан диапазон 0xD800–0xDFFF<tex>D800_{16}..DFFF_{16}</tex>.
В UTF-16 символы кодируются двухбайтовыми словами с использованием всех возможных диапазонов значений (от <tex>00000_{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-32 {{---}} это неэффективное использование пространства, так как для хранения символа используется четыре байта. Символы, лежащие за пределами нулевой (базовой) плоскости кодового пространства редко используются в большинстве текстов. Поэтому удвоение, в сравнении с UTF-16, занимаемого строками в UTF-32 пространства не оправдано.
Хотя использование неменяющегося числа байтов на символ удобно, но не настолько, как кажется. Операция усечения строк реализуется легче в сравнении с UTF-8 и UTF-16. Но это не делает более быстрым нахождение конкретного смещения в строке, так как смещение может вычисляться и для кодировок фиксированного размера. Это не облегчает вычисление отображаемой ширины строки, за исключением ограниченного числа случаев, так как даже символ «фиксированной ширины» может быть получен комбинированием обычного символа с модифицирующим, который не имеет ширины. Например, буква «й» может быть получена из буквы «и» и диакритического знака «крючок над буквой». Сочетание таких знаков означает, что текстовые редакторы не могут рассматривать <tex>32</tex>-битный код как единицу редактирования. Редакторы, которые ограничиваются работой с языками с письмом слева направо и составными символами (англ. ''Precomposed character''), могут использовать символы фиксированного размера. Но такие редакторы вряд ли поддержат символы, лежащие за пределами нулевой (базовой) плоскости кодового пространства и вряд ли смогут работать одинаково хорошо с символами UTF-16.
===Порядок байтов===
В кодировке 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 допускается Юникодом