Представление текстовых данных

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

Для большинства кодировок языков, использующих алфавитную письмен­ность (латиница, кириллица, арабский алфавит, еврейский и греческий язы­ки) достаточно 127 символов. Самая распространенная система кодирования латиницы — ASCII — использует 7 бит на символ. Другие алфавиты обычно кодируются более сложным образом: символы алфавита получают коды в диапазоне от 128 до 255, а коды от 0 до 127 соответствуют кодам ASCII. Та­ким образом, любой символ этих алфавитов, в том числе и в многоязычных текстах, использующих сочетание национального алфавита и латиницы, мо­жет быть представлен 8-ю битами или одним байтом. Но для японских слоговых азбук, а тем более для китайской иероглифики, 255 кодов явно недостаточно, и приходится использовать многобайтовые кодировки. Рас­пространенное обозначение таких кодировок — DBCS (Double Byte Character Set — набор символов, кодируемый двумя байтами).

Двух байтов, в принципе, достаточно, чтобы сформировать единую коди­ровку для всех современных алфавитов и основных подмножеств иерогли­фики. Попытка стандартизовать такое представление — Unicode — пока что не имеет полного успеха. Отчасти это можно объяснить тем, что потреб­ность в представлении разноязыких текстов в пределах одного документа ограничена, кроме того, слишком много старого программного обеспечения использует предположение о том, что символ занимает не более байта. Та­кие программы не могут быть легко преобразованы для работы с Unicode.

 

Используются две основные кодировки латиницы — ASCII(American Standard Code for Information Interchange -Американский стандартный код обмена информацией) и EBCDIC (Extended Binary Coded Decimal Information Code), применяемая системами AS/400, System/370, System/390 и z90 фирмы IBM. Для представления рус­ского варианта кириллицы существует три основных кодировки: альтерна­тивная (известная также как ср866), ср1251 и KOI-8 и ряд менее широко используемых (ISO 8892-5 и др.).

Арифметические операции над такими "числами" обычно бессмысленны, зато большой смысл имеют операции сравнения. Операции сравнения в со­временных процессорах реализованы как неразрушающее вычитание — мы производим те же действия, что и при обычном двоичном вычитании, но запоминаем не сам результат, а лишь флаги знака, переноса и равенства ре­зультата нулю. На основании значений этих флагов определяем результат сравнения: если разность равна нулю, сравниваемые символы одинаковы, если она положительна или отрицательна, один из символов больше или меньше другого.

Естественно, чаще всего мы хотим интерпретировать результаты посимволь­ного сравнения как лексикографическое (алфавитное) "больше" или "меньше" (для русского алфавита, "а" меньше, чем "б"). Проще всего это де­лать, если нумерация символов совпадает с их порядком в алфавите, но да­леко не для всех распространенных кодировок это справедливо.

В кодировке ASCII (American Standard Code for Information Interchange — Американский стандартный код обмена информацией), например, все сим­волы латиницы, цифры и большинство распространенных знаков препина­ния обозначаются кодами от 0 до 127, при этом коды букв расставлены в соответствии с латинским алфавитом. В США, как и в других англоязычных странах, латинский алфавит используется в неизмененном виде, а для пере­дачи звуков, отсутствовавших в оригинальном латинском языке, применяет­ся причудливая орфография. Большинство других европейских алфавитов обходит проблему несоответствия фонетик путем расширения набора сим­волов латиницы — например, в немецком языке добавлены буквы б, а, п и В. Другие языки имеют множество различных "акцентов" и "диакритических символов", расставляемых над буквами для указания особенностей произ­ношения. Некоторые языки, например французский, используют одновре­менно и расширения алфавита, и причудливую орфографию. Нередко встречаются и дополнительные знаки препинания, например, с и j в испанском языке.

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

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

Два основных подхода к представлению форматированного текста - это языки разметки и сложные структуры данных, используемые в текстовых процессорах. Примерами языков разметки являются HTML, LATEX, troff. В этих языках обычный текст снабжается командами, указывающими на то, каким шрифтом следует отображать конкретный фрагмент текста и как его следует форматировать (например, какова ширина параграфа, следует ли делать переносы в словах, надо ли выравнивать текст по левому или право­му краю). Команды представляют собой специальные последовательности символов той же кодировки, в которой набран и основной текст.

Отформатированные таким образом тексты могут генерироваться как вруч­ную (например, LATEX ориентирован именно на ручной набор текста), так и различными автоматизированными средствами.