
Met_Lab2_121113
.pdf
Представление символов в электронных изданиях базируется на таблицах кодов, в которых каждому из отображаемых на экране символов соответствует код от 0 до 255. Первые 127 кодовых комбинаций используются для латинских букв и цифр, знаков пунктуации и т.д. и, как правило, строятся по единому принципу.
Стандарт представления символов ASCII – это 7-битовое описание кода символа. Поскольку в персональных компьютерах используются байты, состоящие из 8 бит, производители компьютеров часто определяют наборы символов, использующие 256 кодов вместо 128 кодов ASCII. В результате получается "расширенный набор символов" (extended character set), который включает в себя набор символов ASCII и до 128 других символов.
В начале 80-х годов производители IBM PC решили расширить набор символов ASCII так, как показано на рис. 3.1. Коды от 20h до 7Ah - это выводимые на дисплей символы из набора символов ASCII. Оставшиеся символы являются нестандартными или, по крайней мере, на тот момент являлись нестандартными .
Кодирование символов
Буквы алфавита, цифры, скобки, запятые и т.д. нужно кодировать цепочками нулей и единиц, так же как и целые числа, как и любую другую информацию. Нужно только условиться о том, какому символу какая цепочка соответствует. Тогда, по коду буквы A на экране дисплея будет нарисована картинка с изображением буквы A, принтер напечатает изображение буквы A. Международным стандартом кодирования символов стал ASCII (произносится "аски") — American Standard Code for Information Interchange — Американский стандартный код для обмена информацией.
Код символа занимает один байт, т.е. всего можно закодировать 256 символов. ASCII фиксирует только коды от 0 до 127 (0h – 7Fh). Коды 128 – 255 (80h – 0FFh) составляют расширение ASCII, которое не стандартизировано. В России в качестве расширения принята так называемая альтернативная кодировка.
Изучим таблицу кодов (её нижнюю половину) подробнее (табл.1.4). Сначала объясним, как она построена. Шапка таблицы соответствует единицам, а боковик — десяткам (в 16ричной системе счисления). Поэтому код буквы z, например, есть 70h + 0Ah = 7Ah.
Таблица 1.4
Символы делятся на два больших класса: графические (для символа имеется изображение) и управляющие (им соответствуют специальные сигналы и функции устройств).
Графические символы. Эти символы разбиваются на несколько классов.
Прописные латинские буквы. A – 41h, B – 42h, C – 43h,…, Z – 5Ah. Код следующей по алфавиту буквы возрастает на единицу. Это позволяет организовать в программах лексикографическое упорядочение цепочек символов: сравниваются коды символов на "больше-меньше".
Строчные латинские буквы. a – 61h, b – 62h, c – 63h, ... z – 7Ah. Код строчной буквы получается прибавлением 20h к коду прописной буквы.
Цифры. 0 – 30h, 1 – 31h, ... , 9 – 39h. Чтобы получить код цифры надо прибавить к цифре код цифры 0, т.е. 30h.
21

Символы пунктуации: ^(){} и т.д. Отметим код пробела 20h. Начинающие ошибочно предполагают, что пробел кодируется нулем.
Управляющие символы. Эти символы при вводе с клавиатуры или при передаче периферийному устройству вызывают выполнение определенной функции или посылку сигнала. Коды этих символов 0 – 1Fh и FFh. Они имеют специальные обозначения. Приведём только два управляющих символа.
LF — line feed — перевод строки (код 0Ah) — перемещает курсор на экране терминала вниз на одну строку.
CR — carriage return — возврат каретки (код 0Dh) — перемещает курсор на экране терминала к началу текущей строки. В большинстве терминалов клавиша Enter вызывает и возврат каретки (CR), и перевод строки (LF).
Задание A1.
1.Преобразовать десятичное число в 16-ричную и двоичную системы счисления (пример 4020).
2.В байте записано число. Перевести его в десятичную систему счисления, рассматривая как беззнаковое и как знаковое. Какому символу кодовой таблицы соотвествует число. Ответ — с обоснованием — должен быть представлен в виде таблицы
Беззнаковое |
Знаковое |
Символ |
54h
D6h
Расширеный набор символов IBM
Этот набор символов закодирован в миллионах микросхем ПЗУ в видеоадаптерах, принтерах и микросхемах BIOS. Он был растиражирован в аппаратуре многочисленных производителей IBM-ориентированных компьютеров и периферии. Для множества программ, работающих в текстовом режиме и написанных не для MS Windows, требуется этот расширенный набор символов, поскольку в них для вывода информации на экран используются символы псевдографики - символы блоков и линий (коды от B0h до D0h).
Рис. 3.1. Расширенный набор символов IBM (упорядочен по возрастанию значений кода символов)
Известно несколько вариантов кодирования символов IBM, которые называются "кодовые страницы" (code pages). Вариант, используемый в Соединенных Штатах Америки и
22

большинстве европейских стран, называется Code Page 437. В системах, распространенных в Норвегии, Дании, Португалии и некоторых других странах Европы, используются другие специальные кодовые страницы, в которых содержится большее количество специальных символов, необходимых для языков этих стран. В последнее время некоторые страны начали применять кодовую страницу Code Page 850, в которой содержится меньшее количество псевдографических символов. За счет этого введены дополнительные символы, знаки ударения и другие специальные символы.
Расширенный набор символов AKSI (AKSI character set)
Расширенный набор символов, который Windows и программы для Windows в большинстве случаев используют, называется набор символов A SI (A SI character set), фактически он является международным стандартом ISO. Кодовая таблица стандарта ANSI представлена на рис. 3.2.
Рис. 3.2. Набор символов ANSI (упорядочен по возрастанию значения кода)
В нашей стране кодовые комбинации начиная со 128 используются для кодирования символов кириллицы, математических символов и другой информации. Причем для каждой платформы используется свое расположение символов в кодовой таблице. Так, известны кодировки Windows, Mac, DOS-OS/2, ISO (Dec) и КОИ-8. Поэтому приходится осуществлять перекодировки символов кириллицы электронных изданий в зависимости от используемой платформы.
Альтернативная кодировка
Справедливости ради следует отметить, что существуют нормативы: "Основная кодировка ГОСТа", "Альтернативная кодировка ГОСТа" и кодировка КОИ-8. В последнем случае символы кириллицы имеют коды: А - Я - 224 - 254 (не в алфавитном порядке); а - я - 192 - 223 (не в алфавитном порядке).
По мнению специалистов, "Альтернативная кодировка ГОСТа" использует под кодировки символов кириллицы позиции, где в кодировке IBM расположены относительно редко используемые символы национальных алфавитов, греческие буквы и некоторые математические символы.
На рис. 3.3 приведена таблица кодировки символов кириллицы для "Альтернативной кодировки ГОСТа" (Alt), "Основной кодировки ГОСТа" (Mai), кодировки MIC и КОИ-8.
23

Рис. 3.3.Кодировки символов кириллицы
Кодировка ISO 8859
ISO 8859 — семейство ASCII-совместимых кодовых страниц, разработанное совместными усилиями ISO и IEC. По состоянию на 2006 год это семейство состояло из 15ти кодовых страниц.
Поскольку кодировки ISO 8859 разрабатывались как средства для обмена информацией, а не как средства обеспечения высококачественной типографики, то в них не включены такие символы, как парные кавычки, тире различной длины, лигатуры и т. п. (хотя там всё же присутствуют такие символы как неразрывный пробел и символ мягкого переноса). Зато довольно много места (область 0x80—0x9F) зарезервировано под «верхние управляющие символы», предназначенные для управления терминалами.
Поскольку различные страницы ISO 8859 разрабатывались совместно, они обладают некоторой взаимной совместимостью. Например, все семь символов расширенной латиницы, используемые в немецком языке, стоят на одинаковых позициях во всех кодовых страницах, включающих эти символы. Страницы Latin-1—Latin-4 обладают ещё большей степенью совместимости: каждый символ, представленный в любых двух из этих страниц, стоит в них на одинаковых позициях.
Применение ISO 8859
Кодировки серии ISO 8859 применяются главным образом на юниксоподобных системах, а также для кодирования веб-страниц (поскольку большинство веб-серверов используют UNIX).
В системах Microsoft Windows используются кодировки Windows, некоторые из которых совместимы с ISO 8859, но включают больше графических символов за счёт использования области 0x80—0x9F.
24

Части ISO 8859
ISO 8859-1 (Latin-1)
Расширенная латиница, включающая символы большинства западноевропейских языков (английский, датский, ирландский, исландский, испанский, итальянский, немецкий, норвежский, португальский, ретороманский, фарерский, шведский, шотландский (гэльский) и частично голландский, финский, французский), а также некоторых восточноевропейских (албанский) и африканских языков (африкаанс, суахили). В Latin-1 отсутствуют знак евро и заглавная буква Ÿ. Эта кодовая страница считается кодировкой по умолчанию для HTMLдокументов и сообщений электронной почты. Также этой кодовой странице соответствуют первые 256 символов Юникода.
ISO 8859-2 (Latin-2)
Расширенная латиница, включающая символы центральноевропейских и восточноевропейских языков (боснийский, венгерский, польский, словацкий, словенский, хорватский, чешский). В Latin-2, как и в Latin-1, отсутствуют знак евро.
ISO 8859-5 (Latin/Cyrillic)
Кириллица, включающая символы славянских языков (белорусский, болгарский, македонский, русский, сербский и частично украинский).
Windows-1251
Windows-1251 — набор символов и кодировка, являющаяся стандартной 8-битной кодировкой для всех русских версий Microsoft Windows. Пользуется довольно большой популярностью. Была создана на базе кодировок, использовавшихся в ранних русификаторах Windows в 1990—1991 гг. совместно представителями компаний «Параграфа», «Диалога» и российского отделения Microsoft. Первоначальный вариант кодировки сильно отличался от представленного ниже в таблице (в частности, там было значительное число «белых пятен»).
Windows-1251 выгодно отличается от других 8 битных кириллических кодировок (таких как CP866, KOI8-R и ISO 8859-5) наличием практически всех символов, использующихся в русской типографике для обычного текста (отсутствует только значок ударения); она также содержит все символы для близких к русскому языку языков: украинского, белорусского, сербского, македонского и болгарского.
Рис. 3.4. Кодировка Windows 1251.
Стандарт кодировки символов UKICODE
Стандарт Юникод/уникод (англ. UNICODE) был предложен некоммерческой организацией Unicode Consortium, образованной в 1991 г. Для представления каждого символа в этом стандарте используются два байта: один байт для кодирования символа, другой для кодирования признака.
25

Стандарт состоит из двух основных разделов: универсальный набор символов (англ. UCS, universal character set) и семейство кодировок (англ. UTF, Unicode transformation format). Универсальный набор символов задаёт однозначное соответствие символов кодам — элементам кодового пространства, представляющим неотрицательные целые числа. Семейство кодировок определяет машинное представление последовательности кодов UCS.
Тем самым обеспечивается информационная совместимость данного способа кодирования со стандартом ASCII. Область с кодами от U+0000 до U+007F содержит символы набора ASCII с соответствующими кодами.
Двухбайтовое описание кодов символов позволяет закодировать очень большое число символов из различных письменностей. Так, в документах Unicode могут соседствовать русские, латинские, греческие буквы, китайские иероглифы и математические символы.
Кодовое пространство Unicode разделено на несколько областей. Область с кодами от 0000 до 007F содержит символы набора Latin 1 (младшие байты соответствуют кодировке ISO 8859-1). Далее идут области, в которых расположены знаки различных письменностей, а также знаки пунктуации и технические символы. Часть кодов зарезервирована для использования в будущем (29000). 6000 кодовых комбинаций оставлено программистам.
Под символы кириллицы выделены области знаков с кодами от U+0400 до U+052F, от U+2DE0 до U+2DFF, от U+A640 до U+A69F. Ниже приведена основополагающая таблица использования кодового пространства Unicode (табл. 3.1).
|
|
Таблица 3.1 |
|
|
|
|
|
Начало области |
Конец области |
Набор символов |
|
|
|
|
|
0000 |
007F |
Basic Latin |
|
|
|
|
|
0080 |
00FF |
Latin-1 Supplement |
|
|
|
|
|
0100 |
017F |
Latin Extended-A |
|
|
|
|
|
0180 |
024F |
Latin Extended-B |
|
|
|
|
|
0250 |
02AF |
IPA Extensions |
|
|
|
|
|
02В0 |
02FF |
Spacing Modifier Letters |
|
|
|
|
|
0300 |
036F |
Combining Diacritical Marks |
|
|
|
|
|
0370 |
03FF |
Greek |
|
|
|
|
|
0400 |
04FF |
Cyrillic |
|
|
|
|
|
0530 |
058F |
Armenian |
|
|
|
|
|
0590 |
05FF |
Hebrew |
|
|
|
|
|
0600 |
06FF |
Arabic |
|
|
|
|
|
0700 |
074F |
Syriac |
|
|
|
|
|
0780 |
07BF |
Thaana |
|
|
|
|
|
0900 |
097F |
Devanagari |
|
|
|
|
|
0980 |
09FF |
Bengali |
|
|
|
|
|
0А00 |
0A7F |
Gurmukhi |
|
|
|
|
|
0А80 |
0AFF |
Gujarati |
|
|
|
|
|
0В00 |
0B7F |
Oriya |
|
|
|
|
|
0В80 |
0BFF |
Tamil |
|
|
|
|
26

0С00 |
0C7F |
Telugu |
|
|
|
|
|
0С80 |
0CFF |
Kannada |
|
|
|
|
|
0D00 |
0D7F |
Malayalam |
|
|
|
|
|
0D80 |
0DFF |
Sinhala |
|
|
|
|
|
0Е00 |
0E7F |
Thai |
|
|
|
|
|
0Е80 |
0EFF |
Lao |
|
|
|
|
|
0F00 |
0FFF |
Tibetan |
|
|
|
|
|
1000 |
109F |
Myanmar |
|
|
|
|
|
10А0 |
10FF |
Georgian |
|
|
|
|
|
1100 |
11FF |
Hangul Jamo |
|
|
|
|
|
1200 |
137F |
Ethiopic |
|
|
|
|
|
13А0 |
13FF |
Cherokee |
|
|
|
|
|
1400 |
167F |
Unified Canadian Aboriginal Syllabics |
|
|
|
|
|
1680 |
16FF |
Ogham |
|
|
|
|
|
16А0 |
169F |
Runic |
|
|
|
|
|
1780 |
17FF |
Khmer |
|
|
|
|
|
1800 |
18AF |
Mongolian |
|
|
|
|
|
1Е00 |
1EFF |
Latin Extended Additional |
|
|
|
|
|
1F00 |
1FFF |
Greek Extended |
|
|
|
|
|
2000 |
206F |
General Punctuation |
|
|
|
|
|
2070 |
209 F |
Superscripts and Subscripts |
|
|
|
|
|
20А0 |
20CF |
Currency Symbols |
|
|
|
|
|
20D0 |
20FF |
Combining Marks for Symbols |
|
|
|
|
|
2100 |
214F |
Letterlike Symbols |
|
|
|
|
|
2150 |
218F |
Number Forms |
|
|
|
|
|
2190 |
21FF |
Arrows |
|
|
|
|
|
2200 |
22FF |
Mathematical Operators |
|
|
|
|
|
2300 |
23FF |
Miscellaneous Technical |
|
|
|
|
|
2400 |
243 F |
Control Pictures |
|
|
|
|
|
2440 |
245F |
Optical Character Recognition |
|
|
|
|
|
2460 |
24FF |
Enclosed Alphanumerics |
|
|
|
|
|
2500 |
257F |
Box Drawing |
|
|
|
|
|
2580 |
259F |
Block Elements |
|
|
|
|
|
25А0 |
25FF |
Geometric Shapes |
|
|
|
|
|
2600 |
26FF |
Miscellaneous Symbols |
|
|
|
|
|
2700 |
27BF |
Dingbats |
|
|
|
|
27

2800 |
28FF |
Braille Patterns |
|
|
|
|
|
2Е80 |
2EFF |
CJK Radicals Supplement |
|
|
|
|
|
2F00 |
2FDF |
Kangxi Radicals |
|
|
|
|
|
2FF0 |
2FFF |
Ideographic Description Characters |
|
|
|
|
|
3000 |
303F |
CJK Symbol sand Punctuation |
|
|
|
|
|
3040 |
309F |
Hiragana |
|
|
|
|
|
30А0 |
30FF |
Katakana |
|
|
|
|
|
3100 |
312F |
Bopomofo |
|
|
|
|
|
3130 |
318F |
Hangul Compatibility Jamo |
|
|
|
|
|
3190 |
319F |
Kanbun |
|
|
|
|
|
31А0 |
31BF |
Bopomofo Extended |
|
|
|
|
|
3200 |
32FF |
Endosed CJK Letters and Months |
|
|
|
|
|
3300 |
33FF |
CJK Compatibility |
|
|
|
|
|
3400 |
4DB5 |
CJK Unified Ideographs Extension A |
|
|
|
|
|
4Е00 |
9FFF |
CJK Unified Ideographs |
|
|
|
|
|
А000 |
A48F |
Yi Syllables |
|
|
|
|
|
А490 |
A4CF |
Yi Radicals |
|
|
|
|
|
АСОО |
D7A3 |
Hangul Syllables |
|
|
|
|
|
D800 |
DB7F |
High Surrogates |
|
|
|
|
|
DB80 |
DBFF |
High Private Use Surrogates |
|
|
|
|
|
D000 |
DFFF |
Low Surrogates |
|
|
|
|
|
Е000 |
F8FF |
Private Use |
|
|
|
|
|
F900 |
FAFF |
CJK Compatibility Ideographs |
|
|
|
|
|
FB00 |
FB4F |
Alphabetic Presentation Forms |
|
|
|
|
|
FB50 |
FDFF |
Arabic Presentation Forms-A |
|
|
|
|
|
FE20 |
FE2F |
Combining Half Marks |
|
|
|
|
|
FE30 |
FE4F |
CJK Compatibility Forms |
|
|
|
|
|
FE50 |
FE6F |
Small Form Variants |
|
|
|
|
|
FE70 |
FEFE |
Arabic Presentation Forms-B |
|
|
|
|
|
FEFF |
FEFF |
Specials |
|
|
|
|
|
FF00 |
FFEF |
Halfwidth and Fullwidth Forms |
|
|
|
|
|
FFF0 |
FFFD |
Specials |
|
|
|
|
Кодовое пространство
Хотя формы записи UTF-8 и UTF-32 позволяют кодировать до 231 (2 147 483 648) кодовых позиций, было принято решение использовать лишь 1 112 064 для совместимости с UTF-16. Впрочем, даже и этого на текущий момент более чем достаточно — в версии 6.0
28
используется чуть менее 110 000 кодовых позиций (109 242 графических и 273 прочих символов).
Кодовое пространство разбито на 17 плоскостей по 216 (65536) символов. Нулевая плоскость называется базовой, в ней расположены символы наиболее употребительных письменностей. Первая плоскость используется, в основном, для исторических письменностей, вторая — для редко используемых иероглифов ККЯ, третья зарезервирована для архаичных китайских иероглифов[12]. Плоскости 15 и 16 выделены для частного употребления.[7]
Для обозначения символов Unicode используется запись вида «U+xxxx» (для кодов 0…FFFF), или «U+xxxxx» (для кодов 10000…FFFFF), или «U+xxxxxx» (для кодов 100000…10FFFF), где xxx — шестнадцатеричные цифры. Например, символ «я» (U+044F) имеет код 044F16 = 110310.
Система кодирования
Универсальная система кодирования (Юникод) представляет собой набор графических символов и способ их кодирования для компьютерной обработки текстовых данных.
Графические символы — это символы, имеющие видимое изображение. Графическим символам противопоставляются управляющие символы и символы форматирования.
Графические символы включают в себя следующие группы:
•буквы, содержащиеся хотя бы в одном из обслуживаемых алфавитов;
•цифры;
•знаки пунктуации;
•специальные знаки (математические, технические, идеограммы и пр.);
•разделители.
Способы представления
Юникод имеет несколько форм представления (англ. Unicode transformation format, UTF): UTF-8, UTF-16 (UTF-16BE, UTF-16LE) и UTF-32 (UTF-32BE, UTF-32LE). Была разработана также форма представления UTF-7 для передачи по семибитным каналам, но изза несовместимости с ASCII она не получила распространения и не включена в стандарт. 1 апреля 2005 года были предложены две шуточные формы представления: UTF-9 и UTF-18 (RFC 4042).
ВMicrosoft Windows NT и основанных на ней системах Windows 2000 и Windows XP
восновном используется форма UTF-16LE. В UNIX-подобных операционных системах GNU/Linux, BSD и Mac OS X принята форма UTF-8 для файлов и UTF-32 или UTF-8 для обработки символов в оперативной памяти.
Punycode — другая форма кодирования последовательностей Unicode-символов в так называемые ACE-последовательности, которые состоят только из алфавитно-цифровых символов, как это разрешено в доменных именах.
UTF-8
UTF-8 — представление Юникода, обеспечивающее наилучшую совместимость со старыми системами, использовавшими 8-битные символы. Текст, состоящий только из символов с номером меньше 128, при записи в UTF-8 превращается в обычный текст ASCII. И наоборот, в тексте UTF-8 любой байт со значением меньше 128 изображает символ ASCII с тем же кодом. Остальные символы Юникода изображаются последовательностями длиной от 2 до 6 байт (на деле, только до 4 байт, поскольку в Юникоде нет символов с кодом больше 10FFFF, и вводить их в будущем не планируется), в которых первый байт всегда имеет вид
29
11xxxxxx, а остальные — 10xxxxxx. В UTF-8 не используются суррогатные пары, 4-x байтов достаточно для записи любого символа юникода.
Формат UTF-8 был изобретён 2 сентября 1992 года Кеном Томпсоном и Робом Пайком и реализован в Plan 9[13]. Сейчас стандарт UTF-8 официально закреплён в документах RFC 3629 и ISO/IEC 10646 Annex D.
Символы UTF-8 получаются из Unicode следующим образом: Unicode UTF-8:
0x00000000 — 0x0000007F: 0xxxxxxx
0x00000080 — 0x000007FF: 110xxxxx 10xxxxxx
0x00000800 — 0x0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
0x00010000 — 0x001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
Теоретически возможны, но не включены в стандарт также:
0x00200000 — 0x03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
0x04000000 — 0x7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
Несмотря на то, что UTF-8 позволяет указать один и тот же символ несколькими способами, только наиболее короткий из них правильный. Остальные формы должны отвергаться по соображениям безопасности.
Порядок байтов
В потоке данных UTF-16 старший байт может записываться либо перед младшим (англ. UTF-16 little-endian), либо после младшего (англ. UTF-16 big-endian). Аналогично существует два варианта четырёхбайтной кодировки — UTF-32LE и UTF-32BE.
Для определения формата представления Юникода в начало текстового файла записывается сигнатура — символ U+FEFF (неразрывный пробел с нулевой шириной), также именуемый маркером последовательности байтов (англ. byte order mark (BOM)). Это позволяет различать UTF-16LE и UTF-16BE, поскольку символа U+FFFE не существует. Также этот способ иногда применяется для обозначения формата UTF-8, хотя к этому формату и неприменимо понятие порядка байтов. Файлы, следующие этому соглашению, начинаются с таких последовательностей байтов:
UTF-8 EF BB BF UTF-16BE FE FF UTF-16LE FF FE UTF-32BE
00 00 FE FF
UTF-32LE
FF FE 00 00
К сожалению, этот способ не позволяет надёжно различать UTF-16LE и UTF-32LE, поскольку символ U+0000 допускается Юникодом (хотя реальные тексты редко начинаются с него).
Файлы в кодировках UTF-16 и UTF-32, не содержащие BOM, должны иметь порядок байтов big-endian (unicode.org).
30