Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Met_Lab2_121113

.pdf
Скачиваний:
18
Добавлен:
11.05.2015
Размер:
1.72 Mб
Скачать

Представление символов в электронных изданиях базируется на таблицах кодов, в которых каждому из отображаемых на экране символов соответствует код от 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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]