48
правок
Изменения
Исправления и новые разделы
== Таблицы кодировок ==
На заре компьютерной эры на каждый символ было отведено по 5 пять бит. Это было связано с малым количеством оперативной памяти на компьютерах тех лет. В эти 64 символа входили только управляющие символы и строчные буквы английского алфавита.
С ростом производительности компьютеров стали появляться таблицы кодировок с большим количеством символов.
Первой 7-битной кодировкой стала ASCII7. В нее уже вошли прописные буквы английского алфавита, арабские цифры, знаки препинания.
Затем на ее базе была разработана ASCII8, в которым уже стало возможным хранение 256 символов: 128 основных и еще столько же расширенных. Первая часть таблицы осталась без изменений, а вторая может иметь различные варианты (каждый имеет свой номер). Эта часть таблицы стала заполняться символами национальных алфавитов.
Но для многих языков (например, арабского, японского, китайского) 256 символов недостаточно, поэтому развитие кодировок продолжалось, что привело к появлению UNICODE.
{{Определение
|definition='''ASCII''' {{- --}} таблицы кодировок, в которых содержатся основные символы (английский алфавит, цифры, знаки препинания, символы национальных алфавитов(свои для каждого региона), служебные символы) и длина кода каждого символа <tex>n = 8</tex> бит.
}}
* '''ASCII7''' - первая кодировка, пригодная для работы с текстом. Помимо маленьких букв английского алфавита и служебных символов, содержит большие буквы английского языка, цифры, знаки препинания и другие символы.
* '''ASCII''' - первая кодировка, в которой стало возможно использовать символы национальных алфавитов.
* '''КОИ8-R''' - первая русская кодировка. Символы кириллицы расположены не в алфавитном порядке. Их разместили в верхнюю половину таблицы так, чтобы позиции кириллических символов соответствовали их фонетическим аналогам в английском алфавите. Это значит, что даже при потере старшего бита каждого символа, например, при проходе через устаревший семибитный модем, текст остается "читаемым".
* '''CP866''' - русская кодировка, использовавшаяся на компьютерах IBM в системе DOS.
* '''Windows-1251''' - русская кодировка, использовавшаяся в русскоязычных версиях операционной системы Windows в начале 90-х годов. Кириллические символы идут в алфавитном порядке. Содержит все символы, встречающиеся в типографике обычного текста (кроме знака ударения).[http:===Структурные свойства таблицы===* Цифры 0—9 представляются своими двоичными значениями (например, <tex>5=0101_2</tex>), перед которыми стоит <tex>0011_2</rutex>.wikipediaТаким образом, двоично-десятичные числа (BCD) превращаются в ASCII-строку с помощью простого добавления слева <tex>0011_2</tex> к каждому двоично-десятичному полубайту.org* Буквы A-Z верхнего и нижнего регистров различаются в своём представлении только одним битом, что упрощает преобразование регистра и проверку на диапазон. Буквы представляются своими порядковыми номерами в алфавите, записанными в двоичной системе счисления, перед которыми стоит <tex>0100_2</wikitex> (для букв верхнего регистра) или <tex>0110_2</CP1251]tex> (для букв нижнего регистра).
'''Юникод''' или '''Уникод''' ( англ. ''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> (2 147 483 648) кодовых позиций, было принято решение использовать лишь 1 112 064 для совместимости с UTF-16. Впрочем, даже и этого на текущий момент более чем достаточно — в версии 6.0 используется чуть менее 110 000 кодовых позиций (109 242 графических и 273 прочих символов).
Кодовое пространство разбито на 17 плоскостей (англ. ''planes'') по <tex>2^{16}</tex> (65 536) символов. Нулевая плоскость называется базовой, в ней расположены символы наиболее употребительных письменностей. Первая плоскость используется, в основном, для исторических письменностей, вторая {{---}} для для редко используемых иероглифов китайского письма, третья зарезервирована для архаичных китайских иероглифов. Плоскости 15 и 16 выделены для частного употребления.
{| 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 || Supplementary special-purpose plane (SSP) || U+E0000…U+EFFFF
|-
| Planes 15-16 || Supplementary 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).
{|class="wikitable"
!Unicode||UTF-8||Представленные символы
Несмотря на то, что UTF-8 позволяет указать один и тот же символ несколькими способами, только наиболее короткий из них правильный. Остальные формы, называемые overlong sequence, отвергаются по соображениям безопасности.
====Принцип кодирования=========Правила записи кода одного символа в UTF-8=====1. Если размер символа в кодировке UTF-8 = 1 байт<br/> : Код имеет вид (0aaa aaaa), где «0» — просто ноль, остальные биты «a» — это код символа в кодировке ASCII; 2. Если размер символа в кодировке в UTF-8 > 1 байт (то есть от 2 до 6): : 2.1 Первый байт содержит количество байтов символа, закодированное в '''единичной''' системе счисления; 2 — 11 3 — 111 4 — 1111 5 — 1111 1 6 — 1111 11 : 2.2 «0» — бит терминатор, означающий завершение кода размера : 2.3 далее идут значащие байты кода, которые имеют вид (10xx xxxx), где «10» — биты признака продолжения, а x — значащие биты. В общем случае варианты представления '''одного символа''' в кодировке 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 (6 байт) 1111 110x 10xx xxxx 10xx xxxx 10xx xxxx 10xx xxxx 10xx xxxx =====Определение длины кода в UTF-8====={| class="wikitable"|-! Количество байт 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</tex>, кодируемых <tex>n</tex> байтами UTF-8, определяется по формуле: <tex>C = 7</tex> при <tex>n=1</tex> <tex>C = n*5+1</tex> при <tex>n>1</tex> ===UTF-16===
UTF-16 {{---}} один из способов кодирования символов (англ. ''code point'') из Unicode в виде последовательности 16-битных слов (англ. ''code unit''). Данная кодировка позволяет записывать символы Юникода в диапазонах U+0000..U+D7FF и U+E000..U+10FFFF (общим количеством 1 112 064), причем 4-байтные символы представляются как есть, а более длинные {{---}} с помощью суррогатных пар (англ. ''surrogate pair''), для которых и вырезан диапазон 0xD800–0xDFFF.
В UTF-16 символы кодируются двухбайтовыми словами с использованием всех возможных диапазонов значений (от <tex>0 </tex> до <tex>FFFF_{16}</tex>). При этом можно кодировать символы Unicode в дипазонах <tex>0000_{16}..D7FF_{16}</tex> и <tex>E000_{16}..10FFFF_{16}</tex>. Исключенный отсюда диапазон <tex>D800_{16}..DFFF_{16}</tex> используется как раз для кодирования так называемых суррогатных пар — символов, которые кодируются двумя 16-битными словами. Символы Unicode до <tex>FFFF_{16}</tex> включительно (исключая диапазон для суррогатов) записываются как есть 16-битным словом. Символы же в диапазоне <tex>10000_{16}..10FFFF_{16}</tex> (больше 16 бит) уже кодируются парой 16-битных слов. Для этого их код арифметически сдвигается до нуля (из него вычитается минимальное число <tex>10000_{16}</tex>). В результате получится значение от нуля до <tex>FFFF_{16}</tex>, которое занимает до 20 бит. Старшие 10 бит этого значения идут в лидирующее (первое) слово, а младшие 10 бит — в последующее (второе). При этом в обоих словах старшие 6 бит используются для обозначения суррогата. Биты с 11 по 15 имеют значения <tex>11011_2</tex>, а 10-й бит содержит 0 у лидирующего слова и 1 — у последующего. В связи с этим можно легко определить к чему относится каждое слово.
====UTF-16LE и UTF-16BE====Один символ кодировки UTF-16 представлен последовательностью двух байтов или двух пар байтов. Который из двух идёт впереди, старший или младший, зависит от порядка байтов. Систему, совместимую с процессорами x86, называют little endian, а с процессорами m68k и SPARC — big endian. ===UTF-32===UTF-32 {{---}} один из способов кодирования символов из Юникод, использующий для кодирования любого символа ровно 32 бита. Остальные кодировки, UTF-8 и UTF-16, используют для представления символов переменное число байтов. Символ UTF-32 является прямым представлением его кодовой позиции (англ. ''code point''). Главное преимущество UTF-32 перед кодировками переменной длины заключается в том, что символы Юникод непосредственно индексируемы. Получение <tex>n<br/tex>-ой кодовой позиции является операцией, занимающей одинаковое время. Напротив, коды с переменной длиной требует последовательного доступа к <tex>n</tex>-ой кодовой позиции. Это делает замену символов в строках UTF-32 простой, для этого используется целое число в качестве индекса, как обычно делается для строк ASCII. Главный недостаток UTF-32 {{---}} это неэффективное использование пространства, так как для хранения символа используется четыре байта. Символы, лежащие за пределами нулевой (базовой) плоскости кодового пространства редко используются в большинстве текстов. Поэтому удвоение, в сравнении с UTF-16, занимаемого строками в UTF-32 пространства не оправдано. Хотя использование неменяющегося числа байтов на символ удобно, но не настолько, как кажется. Операция усечения строк реализуется легче в сравнении с UTF-8 и UTF-16. Но это не делает более быстрым нахождение конкретного смещения в строке, так как смещение может вычисляться и для кодировок фиксированного размера. Это не облегчает вычисление отображаемой ширины строки, за исключением ограниченного числа случаев, так как даже символ «фиксированной ширины» может быть получен комбинированием обычного символа с модифицирующим, который не имеет ширины. Например, буква «й» может быть получена из буквы «и» и диакритического знака «крючок над буквой». Сочетание таких знаков означает, что текстовые редакторы не могут рассматривать 32-битный код как единицу редактирования. Редакторы, которые ограничиваются работой с языками с письмом слева направо и составными символами (англ. ''Precomposed character''), могут использовать символы фиксированного размера. Но такие редакторы вряд ли поддержат символы, лежащие за пределами нулевой (базовой) плоскости кодового пространства и вряд ли смогут работать одинаково хорошо с символами UTF-16. ====Порядок байтов====
Для определения формата представления Юникода в начало текстового файла записывается сигнатура — символ U+FEFF (неразрывный пробел с нулевой шириной), также именуемый маркером последовательности байтов (англ. ''byte order mark (BOM)''). Это позволяет различать UTF-16LE и UTF-16BE, поскольку символа U+FFFE не существует.
[[Файл:Bom.png|thumb|right| 400px]]
BOM также используется для текста обозначенного как UTF-32. Аналогично UTF-16 существует два варианта четырёхбайтной кодировки — UTF-32BE и UTF-32LE. К сожалению, этот способ не позволяет надёжно различать UTF-16LE и UTF-32LE, поскольку символ U+0000 допускается Юникодом
===Проблемы Юникода===
В Юникоде английское «a» и польское «a» {{---}} один и тот же символ. Точно так же одним символом (но отличающимся от «a» латинского) считаются русское «а» и сербское «а». Такой принцип кодирования не универсален; по-видимому, решения «на все случаи жизни» вообще не может существовать.
==Примеры==
Если записать строку 'hello мир' в файл exampleBOM, а затем сделать его hex-дамп, то можно убедиться в том, что разные символы кодируются разным количеством байт. Например, английские буквы,пробел, знаки препинания и пр. кодируются одним байтом, а русские буквы - двумя
* [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 {{---}} Юникод]
* [http://ru.wikipedia.org/wiki/CP1251 Wikipedia {{---}} Windows-1251]
* [https://ru.wikipedia.org/wiki/UTF-8 Wikipedia {{---}} UTF-8]
* [https://ru.wikipedia.org/wiki/UTF-16 Wikipedia {{---}} UTF-16]
* [https://ru.wikipedia.org/wiki/UTF-32 Wikipedia {{---}} UTF-32]
[[Категория: Дискретная математика и алгоритмы]]
[[Категория: Представление информации]]