Кодирование текстовой информации. Кодировка ASCII (American standard code for information interchange) - базовая кодировка текста для латиницы

краткое содержание других презентаций

«Кодирование информации в компьютере» - Двоичное кодирование текстовой информации. Кодирование информации в компьютере. Позиционные и непозиционные системы счисления. Кодирование векторных изображений. Способы кодирования. Таблица кодировки. Количество компьютеров. Римская непозиционная система счисления. Позиционные системы счисления. Один байт информации. Анекдот. Достоинство и недостаток кодирования. Таблица расширенного кода ASCII. Таблица кодировки ASCII.

«Сериализация» - Настраиваемая сериализация. Что можно сериализовать. Десериализация объектов. Экспорт объектов. Сериализация и десериализация. Применение RMI. Сериализация. Удаленные интерфейсы. Поиск удаленных объектов. Distributed garbage collecting. Банк. Реализация счета. Клиент. Вопросы. Концепции RMI. Сериализация в ручную. Автоматическая сериализация. Передача данных. Сериализация и RMI. Схема взаимодействия.

«Примеры кодирования информации» - Шифрование информации. Схема передачи информации. Приемы кодирования изображения. Примеры стенограмм. Способы кодирования информации. Таблица азбуки Морзе. Способ кодирования информации. Кодирование графической и звуковой информации. Естественный язык. Кодирование чисел. Творческое задание. Ответить на вопрос. Кодирование информации. Русский язык. Кодирование текстовой информации. Запись композитором мелодии нотами.

«Урок «Кодирование информации»» - Шифры замены. Орнамент. Шифр перестановки. Шифр Цезаря. Я знаком с шифрами замены. Зашифрованная пословица. Кодовая таблица азбуки Морзе. Топор. Представление информации. Конспект лекции. Кодирование информации. Кодовая таблица флажковой азбуки. Криптография. Способы кодирования информации. Информация.

«Помехоустойчивое кодирование» - Проверки. Введение избыточности. Предположения. Сводка результатов по линейным кодам. Свойства расстояния Хэмминга. Расстояние Хэмминга. Проверочная матрица. Добавление проверки на четность. Длина слов. Недвоичный код. Систематический код. Связь порождающей и проверочной матрицы. Примеры. Систематическое кодирование. Матрицы систематического кода. Обнаружение ошибки перестановки. Свойства расстояния.

«Кодирование видеоинформации» - Возможность использования отдельных объектов в качестве элементов интерактивного действия. Способы сжатия. Кодирование звуковой информации. Использование принципа кодирования индивидуальных объектов. Стандарт MPEG-1. Специальные программы. Стандарт MPEG-4. Взаимосвязи в рамках сюжета. Основные мультимедийные форматы. Стандарт MPEG-2. Основные идеи. Видеоинформация. Формат. Кодирование видеоинформации.

Кодирование текста: ASCII и Unicode (UTF-16)

Человек легко воспринимает текст. Наш мозг ежедневно обрабатывает огромные объёмы текста. В отличие от нас, процессор компьютера может работать только с числами. Поэтому все текстовые данные в памяти компьютера представляются числами. Но перед подробным обсуждением этого момента, давайте вспомним, как организована память компьютера.

Память компьютера - это последовательность битов. Бит - минимальная единица информации, которая может хранить два значения: ноль или единицу. Т.е. все данные, которые может выдавать компьютер (числа, текст, аудио, видео) - это последовательность нулей и единиц.

Бит слишком малая единица. Поэтому биты объединяются в байты. В одном байте восемь бит. Каждый байт имеет свой адрес. Именно байт является минимальной единицей, к которой может обратиться процессор - процессор не может обращаться к отдельным битам, только через соответствующие байты. Давайте посмотрим на небольшой участок памяти компьютера:

01001000 01000101 01001011 01001011 01001111 00100001

Сверху показаны адреса байтов, а снизу - значения, хранящиеся в данных адресах. В реальности не существует таких адресов, так как современные компьютеры работают с огромными адресными пространствами. Адреса в современных компьютерах записываются вот так: 0x01328921. Адреса записываются в шестнадцатеричном формате.

В одном байте может храниться 256 значений - 28 = 256. Диапазон значений: от нуля до 255 (для беззнаковых чисел), или от -128 до 127 (для чисел со знаком). В шестнадцатеричной форме максимальное значение байта - 0xff. Обратите внимание на удобство использования шестнадцатеричной системы счисления: для записи любого однобайтного значения требуется две цифры. Посмотрим на диапазоны однобайтного числа во всех трёх системах счисления:

00000000 ... 11111111

Процессор видит все числа в двоичном виде, но может преобразовывать их в другие системы счисления, чтобы нам их было удобно читать. Правила преобразования между различными системами счисления мы обсуждали в предыдущих уроках. Последовательность байтов, приведённую выше, можно представить и так:

0x48 0x45 0x4b 0x4b 0x4f 0x21 // шестнадцатеричная форма

Компьютеру удобнее использовать бинарную форму, а нам - шестнадцатеричную, или десятичную.

Кодировка ASCII

Чтобы представить текст числами, каждой букве присваивают числовое значение - кодируют значения букв. Присвоив всем буквам уникальное значение, мы получим кодировку (character set, endoding). Но использовать свою кодировку нет никакого смысла - вы сможете использовать её только в своей программе. На данный момент наибольшее распространение получила кодировка ASCII.



Первоначально один символ в кодировке ASCII занимал 7 бит. Но когда распространение получил 8-битный байт (да, существовали байты разных размеров), то ASCII была расширена до восьми бит. 7-битная кодировка в два раза меньше восьмибитной: 27=128 < 28=256.

Итак, первоначально в кодировке ASCII было 128 значений: от 0 до 127 (0x00 до 0x7f). Этого достаточно чтобы закодировать все буквы латинского алфавита, арабские цифры и ещё ряд знаков.

7-битная кодировка ASCII является основой для всех распространённых сейчас кодировок и чрезвычайно важна в программировании. Поэтому мы познакомимся с конкретными значениями:

0 - ноль. Это не цифра в выводимом тексте. К данному коду не привязан никакой символ. Т.е. вы никогда не увидите на экране представление нуля. Тем не менее, ноль очень важен в программировании и хранении текста. Для чего используется этот код, мы узнаем позже.

32 - пробел.

48 - код нуля. Когда мы видим на экране монитора ноль, в памяти компьютера этот символ представлен числом 48.

57 - девятка.

65 - прописная буква A (английский алфавит).

90 - прописная буква Z.

97 - строчная буква a.

122 - строчная буква z.

Давайте вернёмся к рассмотренной ранее последовательности байтов, и попробуем значению каждого поставить в соответствие код из ASCII:

01001000 01000101 01001011 01001011 01001111 00100001 // двоичная (бинарная) форма

72 69 76 76 79 33 // десятичная форма

H E L L O ! // символы ASCII

О, чудо! У нас получился текст "HELLO!"

Компьютер видит всего лишь последовательность байт, к которым он может обратиться по их адресам. Мы можем видеть как простые числа, так и текст, если смотреть на эти числа в кодировке ASCII.

Расширенная кодировка ASCII (extended ASCII)

С появлением восьмибитной кодировки, в ASCII смогли закодировать и другие алфавиты. Расширенных кодировок ASCII много - существуют версии для многих национальных алфавитов. При этом первая половина кодировки (значения от нуля до 127) везде одинаковая.

Русский алфавит (кириллица) закодирован в кодировке с названием windows-1251. Ещё одна популярная версия ASCII - windows-1252 - это кодировка для западноевропейских языков (в ней закодированы буквы специфические для французского и немецкого алфавитов). Кстати, текст, который вы сейчас читаете, закодирован в windows-1251.

Нам не важно, как закодированы русские буквы (да и английские тоже) в windows-1251 - не нужно знать конкретные значения. Если необходимо, можете найти полный список значений символов для windows-1251 в поисковиках.

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

На практике не нужно знать закодированные значения букв. Но в то же время нужно обязательно запомнить закодированные значения цифр. В ASCII цифры имеют коды с 48 до 57. 48 - ноль, 49 - единица... 57 - девять. Напоминаю, что первые 128 значений одинаковы во всех кодировках, поэтому и коды цифр везде совпадают. И это, скажу я вам, очень здорово. Для чего нужно знать коды цифр, и как это связано с созданием игр?

Допустим, в нашей игре нужно выводить на экран значений юнитов пользователя. Внутри программы это простое число, представленное переменной. Но чтобы пользователь увидел это число, его нужно превратить в текст, который и будет отображён на экране. Поэтому при создании игры, нужно обязательно написать код, который занимается преобразованием чисел в текст.

Для примера рассмотрим два значения: в начале игры у пользователя нет юнитов, а через некоторое время он построил пятерых.

Сначала пользователю нужно вывести символ 0. Для этого потребуется использовать закодированное значение этого символа - 48. Затем пользователю нужно вывести символ 5, код которого - 53. Здесь видна интересная особенность: код символа цифры отличается от фактического значения на 48. Поэтому для однозначных (и только для однозначных) чисел мы можем использовать вот такой код:

int var = GetUnitNumber(); // узнать количество юнитов

char output = var+48;

Теперь можно вывести переменную output на экран. Только осталось решить одну проблему: в реальных ситуациях очень редко используются однозначные числа. Например, в Company of heroes у игрока в подчинении находятся в среднем больше 15 отрядов, в Age of Empires - больше 50. В других играх ситуация аналогичная. В шутерах может потребоваться выводить количество патронов и здоровья (значения которых практически всегда больше 9). Конечно же, и при создании своей игры нам нужно будет выводить многозначные числа. Вывод многозначных чисел мы рассмотрим в следующем уроке, а сейчас вернёмся к рассмотрению кодировок.

Кодировка (encoding) Юникод - Unicode

Один байт может иметь только 256 значений. Это значит, что в кодировке ASCII можно закодировать 256символов: цифр, букв, пиктограмм, знаков пунктуации и других различных символов. В то же время существуют письменности, в которых гораздо больше символов, например, китайские или японские иероглифы.

Для решения этой (и некоторых других) проблемы в начале девяностых была создана кодировка Юникод(Unicode). Первоначально все символы юникода занимали два байта. Соответственно, в unicode можно было закодировать 216 = 65536 значений. Затем кодовое пространство было расширено до более чем миллиона символов. В результате этого появилось несколько представлений юникода.

Наиболее популярными представлениями юникода являются два: UTF-8 - используется в интернете и UTF-16 - используется в Windows (Windows XP, Windows Vista, Windows 7).

В контексте создания игр не важно, как кодируются все символы в различных представлениях Unicode. Но важно то, что во всех представлениях арабские цифры кодируются так же, как и в ASCII.

Существует две версии UTF-16: UTF-16LE (little-endian) - кодировка с обратным порядком байтов и UTF-16BE (big-endian) - кодировка с прямым порядком байтов. В Windows, конечно же, используется UTF16-LE.

Код символов в юникоде обозначается так: U+hhhh (четыре шестнадцатеричных цифры, h - от hexadecimal - шестнадцатеричный). Например, U+221A - символ квадратного корня - √.

Часть символов в UTF-16 кодируются двумя байтами (первые 63 тысячи). Остальные символы кодируются суррогатными парами. Так как это не слишком важно для создания игр, то я не буду останавливаться на суррогатных парах подробно.

В UTF-8 первые 128 символов кодируются одним байтом. Остальные символы могут кодироваться несколькими байтами (от двух до четырёх).

И ещё один момент (самый важный): в юникод закодированы все символы всех современных и многих мёртвых письменностей плюс знаки из различных областей науки и культуры (математические и экономически символы, нотные знаки и многое другое). Именно по этой причине и нужно использовать юникод.

Ещё раз повторюсь, что знание стандарта юникода и особенностей его различных представлений, не сильно помогает в такой теме, как создание игр, поэтому дальнейшее знакомство с юникодом вам придётся продолжать самостоятельно. Неоценимую помощь в этом деле окажет, как обычно, стандарт.

Кодирование текста в Microsoft Windows (Windows XP, Windows Vista, Windows 7)

В современных версиях Windows существует два способа представления текста: UTF-16 и кодовые страницы (в основном это восьмибитные кодировки). Основной способ - юникод. Кодовые страницы нужны для совместимости со старыми приложениями (в Windows 95, Windows 98 - в основном использовалась ASCII). Кроме того, юникод не понимает одна очень важная программа - консоль.

Пусть вас не смущает новый термин - кодовая страница (code page). В windows так называются все кодировки (character sets или encodings). Т.е. понятие кодировка равнозначно кодовой странице.

Сразу сделаю замечание, которое лучше запомнить. В Windows есть чёткое разделение: вот юникод (UTF-16LE), а вот все остальные кодировки. И юникод, и остальные кодировки в Windows называются кодовыми страницами, но этот термин (кодовые страницы) я буду применять ко всем кодировкам за исключением юникода.

Когда мы писали консольные программы, вывод текста осуществлялся с помощью кодовой страницы windows-1252. Именно поэтому нам приходилось вызывать setlocale (она меняет кодовую страницу на windows-1251):

Эта функция меняет локальность.

Locale (местная специфика) - локальность

В Windows есть такое понятие как Locale. Здесь я не совсем верно использую кальку этого слова - локальность, но, на мой взгляд, она довольно ёмкая, чтобы вместить весь смысл понятия Locale. Locale переводится как местные особенности. Т.е. это какие-то параметры используемы в данном конкретном месте (регионе, стране). setlocale как раз и меняет эти особенности:

setlocale(LC_CTYPE,"Russian");

В данном вызове локальность меняется на российскую. Поэтому Windows может использовать наши местные особенности: представление даты и времени, систему измерения, валюту и, конечно же, кодовую страницу.

Первый параметр этой функции говорит, какие категории местных особенностей можно изменить. Можно изменить только кодовую страницу (LC_CTYPE), можно формат представления даты и времени (LC_TIME), а можно изменить и все категории (LC_ALL, all - всё).

Возвращаемся к кодировкам.

Одновременно может использоваться только одна кодовая страница, при этом с символами кодовой страницы в программе можно использовать и юникод, так как юникод стоит особняком от всех остальных кодовых страниц. Старайтесь в своих программах всегда использовать юникод. Кодовые страницы имеет смысл использовать только в консоли.

В системе кодирования ASCII (American Standard Code for Information Interchange - стандартный код информационного обмена США) каждый символ представлен одним байтом, что позволяет закодировать 256 символов.

В ASCII имеется две таблицы кодирования - базовая и расширенная. Базовая таблица закрепляет значения кодов от 0 до 127, а расширенная относится к символам с номерами от 128 до 255. Этого хватит, чтобы выразить различными комбинациями восьми битов все символы английского и русского языков, как строчные, так и прописные, а также знаки препинания, символы основных арифметических действий и обще­принятые специальные символы, которые можно наблюдать на клавиатуре.

Первые 32 кода базовой таблицы, начиная с нулевого, отданы производителям аппаратных средств (в первую очередь производителям компьютеров и печатаю­щих устройств). В этой области размещаются так называемые управляющие коды, которым не соответствуют никакие символы языков, и, соответственно, эти коды не выводятся ни на экран, ни на устройства печати, но ими можно управлять тем, как производится вывод прочих данных. Начиная с кода 32 по код 127, размещены символы английского алфавита, знаки препинания, цифры, арифметические действия и вспомогательные символы, все их можно видеть на латинской части клавиатуры компьютера.

Вторая, расширенная часть отдана национальным системам кодирования. В мире существует много нелатинских алфавитов (арабский, еврейский, греческий и пр.), в число которых входит и кириллица. Кроме того, немецкая, французская, испанская раскладки клавиатуры отличаются от английской.

В английской части клавиатуры раньше было много стандартов, а теперь все они заменены на единый код ASCII. Для русской клавиатуры тоже существовало много стандартов: ГОСТ, ГОСТ-альтернативная, ISO (International Standard Organization - Между­народный институт стандартизации), но эти три стандарта фактически уже вымерли, хотя и могут где-то встретиться, в каких-то допотопных компьютерах или в компьютерных сетях.

Основная кодировка символов русского языка, которая используется в компьютерах с операционной системой Windows называется Windows-1251 , она была разработана для алфавитов кириллицы компанией Microsoft. Естественно, что в Windows-1251 закодировано абсолютное большинство компьютерных текстовых данных. Кстати кодировки с другим четырехзначным номером разработаны Microsoft для других распространенных алфавитов: арабского, японского и прочих.

Другая распространенная кодировка носит название КОИ-8 (код обмена информа­цией, восьмизначный) - ее происхождение относится ко временам действия Совета Экономической Взаимопомощи государств Восточной Европы. Сегодня кодировка КОИ-8 имеет распространение в компьютерных сетях на терри­тории России и в российском секторе Интернета. Бывает так, что какой-то текст письма или еще чего-то не читается, это значит, что надо перейти из КОИ-8 в Windows-1251. 10

В 90-х годах крупнейшие производители программного обеспечения: Microsoft, Borland, та же Adobe приняли решение о необходимости разработки другой системы кодировки текста, в которой каждому символу будет отводиться не 1, а 2 байта. Она получила название Unicode , и в ней можно закодировать 65 536 символов этого поля достаточно для размещения в одной таблице национальных алфавитов для всех языков планеты. Большую часть Unicode (около 70%) занимают китайские иероглифы, в Индии имеется 11 различных национальных алфавитов, есть множество экзотических названий, например: письменность канадских аборигенов.

Поскольку на кодирования каждого символа в Unicode отводится не 8, а 16 разрядов, объем текстового файла увеличивается в 2 раза. Когда-то это было препятствием для введения 16-разрядной системы. а сейчас при гигабайтных винчестерах, сотнях мегабайт оперативной памяти, гигагерцных процессорах удвоение объемов текстовых файлов, которые по сравнению, например, с графикой занимают очень немного места, большого значения не имеет.

Кириллица занимает в Unicode места с 768 по 923 (основные знаки) и с 924 по 1023 (расширенная кириллица, различные малораспространенные, национальные буквы). Если программа не адаптирована под кириллицу Unicode, то возможен вариант, когда символы текста распознаются не как кириллица, а как расширенная латиница (коды с 256 по 511). И в этом случае вместо текста на экране появляется бессмысленный набор различных экзотических символов.

Такое возможно, если программа устаревшая, созданная до 1995 года. Или малораспространенная, о русификации которой никто не позаботился. Еще возможен вариант, когда установленная на компьютере ОС Windows не полностью настроена под кириллицу. В этом случае надо сделать соответствующие записи в реестре.

ЕВЕ (End of Blockette ) - конец вложенного блока. Сегодня этот код, разделяющий между собой элементы одной записи, назвали бы «концом поля».

EOF (End of File ) - конец сообщения (конец передачи, конец файла данных).

Схема кодирования ASCII

Первая попытка стандартизировать коды символов для ЭВМ состоялась в 1963 г. в США, когда была создана первая версия стандарта ASCII (по-русски произносится как «аски »). Система кодирования получилась не совсем удачной, вызвала множество нареканий и вскоре была подготовлена вторая, более успешная версия, принятая в 1968 г. Она используется по сей день. Название стандарта расшифровывается какAmerican Standard Code for Information Interchange - Стандартный код внут-

реннего информационного обмена США. Его ввёл в действие Национальный институт стандартиза-

ции США (ANSI, American National Standard Institute).

Таблица ASCII предназначена для семиразрядного кодирования 128 различных символов (). Этого достаточно, чтобы представить строчные и прописные буквы английского алфавита, знаки препинания, цифры, знаки математических действий, а также некоторые специальные знаки, например такие, как @, #, § и другие.

Первые 32 кода таблицы ASCII (от 0 до 31) не представляются печатными знаками. Эта область отведена для размещения специальных символов:

управляющих кодов (служат для управления удаленными устройствами, например принтерами);

кодов форматирования (служат для специального оформления сообщений);

кодов-разделителей (служат для структурирования передаваемых наборов данных).

Отечественные схемы 8-разрядного кодирования текстов

Активное внедрение национальных стандартов кодирования текстовых символов относится к 70-м годам XX века. Эти процессы затронули всю Европу. Не остался в стороне и Советский Союз: были утверждены первые национальные 8-разрядные схемы кодирования.

При 8-разрядном кодировании на запись символа отводится байт, имеющий 256 различимых состояний. Это позволяет кодировать двуязычные символьные наборы, например английский и русский. Англоязычную часть размещают в нижней части таблицы (коды от 0 до 127), а национальную часть - в верхней (коды от 128 до 255).

Схема кодирования ISO-8859

Формально для России эта схема кодирования имеет наивысший приоритет, потому что утверждена Международным институтом стандартизации (ISO -International Standard Organization ). В стандарте ISO-8859 кодированию символов кириллицы (кириллицей называют письменную систему славянских языков) выделена так называемая «пятая кодовая страница», поэтому этот стандарт именуют такжеISO 8859-5 .

Нa практике документы, использующие эту схему, встречаются редко, особенно на компьютерах платформы IBM PC . Эту кодировку чаще можно встретить в документах, выполненных на компьютерах платформыSun . Несмотря на малую распространённость, эта система кодирования имеет

Наложение символов

Благодаря символу BS (возврат на шаг) на принтере можно печатать один символ поверх другого. В ASCII было предусмотрено добавление таким образом диакритики к буквам, например:

  • a BS " → á
  • a BS ` → à
  • a BS ^ → â
  • o BS / → ø
  • c BS , → ç
  • n BS ~ → ñ

Примечание : в старых шрифтах апостроф " рисовался с наклоном влево, а тильда ~ была сдвинута вверх, так что они как раз подходили на роль акута и тильды сверху.

Если на символ накладывается тот же символ, то получается эффект жирного шрифта, а если на символ накладывается подчёркивание, то получается подчёркнутый текст.

  • a BS a → a
  • a BS _ → a

Примечание : это используется, например, в справочной системе man .

Национальные варианты ASCII

Стандарт ISO 646 (ECMA-6) предусматривает возможность размещения национальных символов на месте @ [ \ ] ^ ` { | } ~ . В дополнение к этому, на месте # может быть размещён £ , а на месте $ - ¤ . Такая система хорошо подходит для европейских языков, где нужны лишь несколько дополнительных символов. Вариант ASCII без национальных символов называется US-ASCII, или «International Reference Version».

Впоследствии оказалось удобнее использовать 8-битные кодировки (кодовые страницы), где нижнюю половину кодовой таблицы (0-127) занимают символы US-ASCII, а верхнюю (128-255) - дополнительные символы, включая набор национальных символов. Таким образом, верхняя половина таблицы ASCII до повсеместного внедрения Юникода активно использовалась для представления локализированных символов, букв местного языка. Отсутствие единого стандарта размещения кириллических символов в таблице ASCII доставляло множество проблем с кодировками (КОИ-8 , Windows-1251 и другие). Другие языки с нелатинской письменностью тоже страдали из-за наличия нескольких разных кодировок.

.0 .1 .2 .3 .4 .5 .6 .7 .8 .9 .A .B .C .D .E .F
0. NUL SOM EOA EOM EQT WRU RU BELL BKSP HT LF VT FF CR SO SI
1. DC 0 DC 1 DC 2 DC 3 DC 4 ERR SYNC LEM S 0 S 1 S 2 S 3 S 4 S 5 S 6 S 7
2.
3.
4. BLANK ! " # $ % & " ( ) * + , - . /
5. 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
6.
7.
8.
9.
A. @ A B C D E F G H I J K L M N O
B. P Q R S T U V W X Y Z [ \ ]
C.
D.
E. a b c d e f g h i j k l m n o
F. p q r s t u v w x y z ESC DEL

На тех компьютерах, где минимально адресуемой единицей памяти было 36-битное слово, поначалу использовали 6-битные символы (1 слово = 6 символов). После перехода на ASCII на таких компьютерах в одном слове стали размещать либо 5 семибитных символов (1 бит оставался лишним), либо 4 девятибитных символа.

ASCII-коды используются также для определения нажатой клавиши при программировании. Для стандартной QWERTY-клавиатуры таблица кодов выглядит следующим образом: