вторник, 8 января 2013 г.

Кодирование текстовой информации

Сегодня я хочу поговорить о кодировках. Зачем вообще нужны кодирование текстов и почему это так важно? Какие кодировки текста существуют и какие из них следует использовать?
У вас встречалась ситуация, когда вы получаете электронное письмо, но не можете его прочитать – вместо текста идут какие-то непонятные знаки? То же самое случается и в интернете – открываете страницу, а разобрать ничего не возможно. Причем заметьте, подобное происходит именно с русским текстом, с английским подобные проблемы маловероятны. Причина проблем – открытие файла в неверной кодировке.


Соответствие между набором символов и набором числовых значений называется кодировкой символа.
В процессе вывода символа на экран производится обратная операция – декодирование, т.е. преобразование кода символа в изображение.
Присвоенный каждому символу конкретный числовой код фиксируется в кодовых таблицах. Причем, в разных таблицах одному и тому же символу могут соответствовать разные числовые коды. Обычно перекодированием текста занимаются специальные программы-конвертеры, они встроены в большинство приложений.

Зачем нужны кодировки

Символы на экране вашего компьютера формируются на основе двух вещей — наборов векторных форм (представлений) всевозможных символов (они находятся в файлах со шрифтами, которые установлены на вашем компьютере) и кода, который позволяет выдернуть из этого набора векторных форм (файла шрифта) именно тот символ, который нужно будет вставить в нужное место.

Кодировка ASCII

Для начала немного посчитаем. Помните, что такое бит? Это минимальный носитель информации, ноль или один. А байт содержит восемь битов. Сколько может быть комбинаций из нулей и единиц длины 8? Ответ – 2*2*2*2*2*2*2*2=256. Именно столько значений может принимать один байт. Иногда еще байт называют символом – потому что как раз для кодировки символа и стали использовать один байт. Даже меньше, изначально была придумана кодировка ASCII, которая использовала 7 битов – в первые 128 значений можно было вольготно разместить английский алфавит в обоих регистрах, диакритические знаки, цифры и набор спец-символов. И эта кодировка действительно стала универсальной, поэтому англоязычные пользователи крайне редко могут испытывать проблемы с кодировкой.
Кодировка ASCII (American Standard Code for Information Interchange, которая по русски обычно произносится как «аски») описывает первые 128 символов из наиболее часто используемых англоязычными пользователями — латинские буквы, арабские цифры и знаки препинания. Так же еще в эти 128 символов кодировки ASCII попадали некоторые служебные символы, навроде скобок, решеток, звездочек и т.п. Именно эти 128 символов из первоначального вариант ASCII стали стандартом, и в любой другой кодировке текста вы их обязательно встретите и стоять они будут именно в таком порядке. Но дело в том, что с помощью одного байта информации можно закодировать не 128, а целых 256 различных значений (двойка в степени восемь равняется 256), поэтому вслед за базовой версией ASCII появился целый ряд расширенных кодировок ASCII, в которых можно было кроме 128 основных символов закодировать еще и символы национальной кодировки (например, русской).

Кодировка КОИ-8R

Принцип работы кодировки KOI-8R такой— каждый символ текста кодируется одним единственным байтом.
Среди особенностей кодировки KOI-8R можно отметить то, что русские буквы в ее таблице идут не в алфавитном порядке. В кодировке KOI-8R русские буквы расположены в тех же ячейках таблицы, что и созвучные им буквы латинского алфавита из первой части таблицы ASCII. Это было сделано для удобства перехода с русских символов на латинские путем отбрасывания всего одного бита (два в седьмой степени или 128).

Кодировка Unicode

Перейдем к кириллице. Для нее стали использовать вторую половину кодовой таблицы – символы 129-256. Однако так сложилось, что различные кодировки были изобретены независимо – одни изобретатели располагали буквы, стремясь к соответствию расположения на пишущих машинках, другие – к тому, чтобы одинаково выглядящие кириллические и латинские буквы находились на расстоянии в 128 (что приводило к тому, что даже программы, не умевшие работать со второй половиной таблицы, более-менее читаемо отображали русский текст). Были и другие идеи; появление Windows также принесло свою кодировку. Но главное, такая кодировка принципиально не могла стать универсальной, так как если латиница была нужна везде (хотя бы для командной строки), то кириллица была лишь одним из национальных алфавитов.
У единой, потенциально универсальной кодировки, существует название: Unicode, и придумана она была уже давно, в 1991 году. В Юникоде используется 6 байтов для отображения символа.
Например, в операционной системе Windows вы можете пройти по пути Пуск — Программы — Стандартные — Служебные — Таблица символов. В результате откроется таблица с векторными формами всех установленных у вас в системе шрифтов. Если вы выберите в Дополнительных параметрах набор символов Юникод, то сможете увидеть для каждого шрифта в отдельности весь ассортимент входящих в него символов. Кстати, щелкнув по любому из этих символов вы сможете увидеть его двухбайтовый код в кодировке UTF 16, состоящий из четырех шестнадцатеричных цифр.

Кодировки кириллицы

Как правило, для хранения кода символа используется 1 байт (8 битов).
Поэтому коды символов могут принимать значение от 0 до 255. Такие кодировки называют однобайтными. Они позволяют использовать 256 символов (2 в восьмой степени равно 256). Таблица однобайтных кодов символов ASCII состоит из двух частей. Первая часть таблицы ASCII-кодов (от 0 до 127) стандартна для всех компьютеров и содержит:
  • коды управляющих символов,
  • коды цифр, арифметических операций, знаков препинания,
  • некоторые специальные символы,
  • коды больших и маленьких латинских букв.
Вторая часть таблицы (коды от 128 до 255) бывает различной в различных компьютерах. Она содержит:
  • коды букв национального алфавита,
  • коды некоторых математических символов,
  • коды символов псевдографики.
Для русских букв используются такие различные кодовые таблицы: КОИ-8, ISO, Mac, CP1251, CP866.
В последнее время широкое распространение получил новый международный стандарт Unicode.
В Unicode отводится по 2 байта (16 битов) для кодирования каждого символа.
Поэтому с его помощью можно закодировать 65536 различных символов (2 в шестнадцатой степени равно 65536). Коды символов могут принимать значение от 0 до 65535.

Примеры решения задач

1. С помощью кодировки Unicode закодирована следующая фраза: Я хочу поступить в университет!
Оцените информационный объем этой фразы.
Решение:
В данной фразе содержится 31 символ (включая пробелы и знак препинания). Поскольку в кодировке Unicode каждому символу отводится 2 байта памяти, для всей фразы понадобится 31*2 = 62 байта или 31*2*8 = 496 битов.

2. Статья, набранная на компьютере, содержит 8 страниц, на каждой странице 40 строк, в каждой строке 64 символа. В одном из представлений Unicode каждый символ кодируется 16 битами. Определите информационный объем статьи в этом варианте Unicode. Выберите верный ответ из предложенных: а) 320 байт, б) 35 Кбайт , в) 640 байт, г) 40 Кбайт.
Определим количество символов: 8*40*64 = 20480. Поскольку в кодировке Unicode каждому символу отводится 16 битов памяти, для всей фразы понадобится 20480*16 = 327680 битов.
Переведем полученное значение в байты. Т.к. 8 бит = 1 байт, то 327680 : 8 = 40960 байт
Теперь в Кбайты. Т.к. 1024 байт = 1 Кбайт, то 40960 : 1024 = 40 Кбайт.
Из предложенных вариантов подходит вариант г) 40 Кбайт.

Решите самостоятельно

  1. В кодировке КОИ-8 каждый символ кодируется 1 байтом. Определите информационный объем сообщения из 20 символов в этой кодировке. Варианты ответов: а) 20 бит, б) 80 бит, в) 160 бит, г) 320 бит.
  2. В кодировке Unicode на каждый символ отводится 2 байта. Определите информационный объем слова из 24 символов в этой кодировке. Найдите верный ответ: а) 384 бита, б) 192 бита, в) 256 бит, г) 48 бит.
Сайт:  http://school.dtv.su/obo-mne/

1 комментарий: