Главная » Delphi » О кодировках

0

Надо сказать, что обеспечить выполнение указанных задач в общем случае непросто, и все DOS-тексты тому ярчайший пример: если отображать нечто, набранное в DOS-редакторе французом или испанцем, т. е. с использованием символов с номерами 128—255, то на компьютере с включенной поддержкой русской кодовой страницы вы получите нечитаемый текст из бессмысленного набора кириллических символов вперемешку со специальными знаками. То же самое будет, если исходный текст вполне русский, но текущая и заложенная в документ кодировки различаются.

Так как же дать понять компьютеру, что перед ним некий конкретный язык (кодировка) с тем, чтобы он подставил в нужные места нужные начертания символов (кодовую страницу)? Решение задачи— даже два разных решения — на самом деле было известно давно, со времен слепого французского врача Луи Брайля (Louis Braille, 1809—1852 гг.), который еще в мальчишеском возрасте придумал последовательную систему рельефных точек, кодирующих буквы алфавита, цифры и знаки препинания для слепых — несколько дополненная, азбука Брайля используется и в наши дни. Базовый элемент системы Брайля содержиг 6 позиций-ячеек, каждая из которых может быть выпуклой или плоской — т. е. его кодировка основанв на двоичном коде. Всего в ней можно закодировать 2(‘ = 64 символа, однако Брайлем был предусмотрен механизм практически неограниченного расширения количества кодируемых символов — для этого употребляются коды-переключатели (Shin- коды). Наличие такого переключателя означает, что все последующие знаки надо читать определенным образом (например, как цифры, а не буквы), до тех пор, пока не встретится другой подобный знак. Другая разновидность переключающих кодов (Escape-коды) действует только на один знак после такого кода, и тоже впервые введена в азбуке Брайля. Забегая вперед, заметим, что вы уже, несомненно, узнали Shift-переключатели в современных тегах HTML.

Предшественником современных компьютерных кодировок принято считать коды, разработанные еще в 1874 г. французом Эмилем Бодо (Jean- Maurice-Emile Baudot 1845—1903 гг.), усовершенствованные позднее Дональдом Мюрреем и принятые в качестве международного стандарта в 1931 году. Официальное название кода Бодо— International Telegraph Alphabet #2, ITA-2. Он применялся в телетайпных аппаратах и, соответственно, в первых компьютерах, некоторые из них эти аппараты использовали в качестве входных/выходных консолей. Коды Бодо – пятибитовые, поэтому количество представленных символов ограниченно 32, чего для всех необходимых символов не хватает. Для увеличения этого числа, как и в коде Брайля, использовались Shift-переключатели. Основная проблема была в том, что переключатель типа Shift действует до тех пор, пока не встретится другой переключатель, отменяющий первый. Поэтому если какое-то сообщение заканчивается цифрой, то начало следующего за ним текста до первого отменяющего переключателя будет представлять бессмысленный набор цифр вместо букв (в HTML эта проблема решена тем, что каждому подобному тегу поставлен в соответствие закрывающий тег). С этим мог сталкиваться каждый, кто пытался печатать "красиво" на матричных принтерах, скажем, на популярном некогда FX-800 или еще более древнем Robotron 6329. Если некий текст заканчивался курсивом без отмены этого режима в конце документа, то следующая попытка что-то распечатать приводила к тому, что документ тоже начинался с курсива.

В 1963 году возник, а в 1967 году был утвержден в качестве стандарта American Standard Code for Information Interchandge — ASCII (см. приложение 3), который и является до сих пор основой всех кодовых таблиц, устанавливая символы с номерами 0—127 (точнее, 32—127, т. к. символы с номерами 0—31 представляют собой команды и могут интерпретироваться по- разному, хотя формально входят в ASCII). У истоков ASCII стояла фирма AT&T, а также IBM. Ради полноты картины следует упомянуть, что для мэйнфреймов IBM вплоть до начала 80-х годов был принят другой код — EBCDIC, довольно громоздко устроенный, и ведущий свое происхождение от систем перфокартой ного ввода.

Что касается русскоязычных кодировок, то в середине 70-х гг. возникла KOI, в которой русские буквы во второй половине таблицы ставились на такие места, чтобы при вычитании числа 128 (т. е. при обнулении старшего бита) из кода получалась соответствующая по звучанию (но не всегда — по написанию) английская буква, причем в противоположном регистре, чтобы отличить английский текст от русского. Скажем, "Русский Текст" превратилось бы в "rUSSKIJ tEKST". Сделано это было потому, что первые почтовые серверы были семибитовыми, т. е. моглн передавать только ASCII. KOI-8 существовала в виде общесоюзного стандарта (ГОСТ-19768-74) и даже чуть было не была утверждена в качестве международного (ISO-IR-111 или ECMA-Cyrillic). Упомянутый ГОСТ впоследствии был заменен на мертворожденный ГОСТ 19768-93′, вообще к нам — пользователям ПК— никакого отношения не имеющий, т. к. устанавливает ни с чем не совпадающие кодовые таблицы для ЕС ЭВМ, выпуск которых почти полностью к моменту создания этого ГОСТа был прекращен. Таким образом, надо поннмать, KOI-8r в настоящее время не описывается никаким ГОСТом. Тем не менее KOI-8r (вообще кодировок с общим названием KOI существует по меньшем мере семь) как была, так и осталась самым распространенным стандартом для электронной почты и в славные времена создания Релкома, в конце 80-х гг., была возведена в ранг интернет-стандарта под названием RFC-1489. Тут, конечно, сыграло свою роль то, что она и была к тому времени стандартом де-факто (подкрепленным авторитетом того самого ГОСТа от 1974 годв) для UNIX-систем, которые доминировали в сетевых делах.

С распространением компьютерного дела в нашей стране и в родственных странах было разработано множество разных кириллических кодировок (в том числе "украинская", "польская", "болгарская" и др. — последняя и до сих пор используется в болгарской Linux). Среди них наибольшую известность получили "основная" (ISO/IEC 8859-5-88) и "альтернативная" (MS- DOS, СР866) кодировки ГОСТ, на текущий момент стандартизированные в ГОСТ Р 34.303-92, который в основной своей части (касающейся таблицы 8859-5) является простым переводом стандарта ISO 4873-86. "Основная кодировка ГОСТ", несмотря на солидную поддержку со стороны разработчиков стандартов, широко не использовалась на практике, видимо, никогда2 — придумать хоть какое-то рациональное обоснование ее преимуществ невозможно, сам Госстандарт сейчас спокойно приветствует посетителей на своем сайте в кодировке Win 1251.

Сложившимся стандартом для DOS стала "альтернативная" кодировка, которая отличается от всех остальных наибольшей, пожалуй, продуманностью (на своих местах остались символы псевдографики н многие другие спецсимволы из второй половины ASCII — т. е. оформленный с их использованием английский текст абсолютно не менялся независимо от текущей кодовой страницы). Но в этой кодировке символы располагаются не подряд (как будто это имеет хоть какое-нибудь принципиальное значение), потому с развитием Windows придумали еще одну кодировку, в обычном стиле Microsoft проигнорировавшую все традиции и стандарты. Ее создатели отчасти справедливо рассудили, что символы псевдографики при наличии графических WYS1WYG-редакторов как-то ни к чему. Кириллическая азбука волюнтаристски заняла последние 64 ячейки таблицы, кроме букв "Ё" и "е", которые вставили куда-то в середину. Новая кодировка получила название "Windows 1251" (Win 1251). Интересно, что внедрением и СР866 и 1989 году и Win 1251 в 1995 году занимался один и тот же человек— россиянин Петр Квитек. На самом деле на настоящий момент действуют параллельно пять однобайтовых кириллических кодировок, вы с ними можете ознакомиться в приложении 3.

Истоки еще одной отдельной разновидности кодировок надо искать в устройстве первых почтовых серверов— это пересылка вложений. Казалось бы, в чем проблема — передавай себе байты по Сети, и все тут. Но, как мы говорили ранее, почта изначально была "заточена" исключительно под обмен английскими алфавитными символами, т. е. кодами ASCII 32—127. Коды в таблице ASCII, меньшие чем 32, т. е. команды, вообще не должны отображаться на экране, а коды, большие 127, могли обрезаться семибитными серверами (или подвергаться двойной перекодировке в российских пенатах — хоть эта проблема, к счастью, почти изжита). Как же отличить текст письма от вложения? Для этого последние, в которых по определению могут содержаться байты с любым значением, передают довольно сложным путем: коды преобразовываются так, чтобы они содержали только байты со значением из интервала 33—127. Так устроены распространенные системы кодирования вложений, например, base64.

Таким образом, чтобы решить проблему отображения многоязычных документов, напрашивается следующий путь: просто стандартизировать ряд Shift- кодов ("тегов"), определенных для каждого языка, и проблема решена— по крайней мере, в принципе. Правда, то, что называется "чистый текст", все равно осталось бы читаемым неоднозначно, но для продвижения многоязыковых систем была бы хорошая отправная точка. По этому пути попытались пойти разработчики из ISO и, вслед за ними, из Госстандарта. ГОСТ 27463-87 (он же ISO 646-83, устанавливающий национальные таблицы 7-битных кодов), ГОСТ 27465-87 (устанавливающий наборы русскоязычных символов) и обширный ГОСТ 27466-87 (ISO 2022-86, устанавливающий правила расширения кодовых таблиц) представляют собой довольно стройную систему, являющуюся ничем иным, как альтернативой Unicode. Их принцип — это переключение между наборами символов с помощью Shift-переключателей, которые в этих документах называются "последовательности АР2". Система эта не получила никакого практического применения, видимо, по двум причинам: в силу своей громоздкости и, главное, ограниченности — уже для алфавитов, включающих более чем 256 символов, она становится настолько сложной, что двухбайтовая Unicode выглядит на ее фоне много симпатичнее. Нечто похожее, правда, с меньшим размахом, пытались придумать и в ANSI (American National Standarts Institute)— в DOS можно было подключить некий ANSI-драйвер, которым, однако, на практике никто все равно не пользовался.

В HTML идея Shift-переключателей в конце концов была доведена до некоторого логического завершения. В части языковой поддержки соответствующие теги в HTML просто указывают, какой именно шрифт нужно в данный момент использовать (а также его начертание, размер, цвет и т. п. — см. главу 16). Совершенно аналогично устроен, например, формат RTF. А уж личное дело пользователя — есть у него на компьютере такой шрифт или нет. Вот на этом последнем обстоятельстве здравая в принципе идея "тормознулась": проблема наличия нужных шрифтов оказалась настолько сложной, что редакторы интернет-ресурсов обычно справедливо запрещают использовать длинные тире, фигурные кавычки или символы типа "№" в сетевых публикациях— с высокой степенью вероятности они у пользователя будут выглядеть одинаковыми знаками вопроса’. В перемещаемых же документах все несколько проще — по идее, можно внедрить шрифт в сам документ, хотя это и увеличивает его размер, но зато гарантирует от неправильного отображения.

Рис. 8.1. Демонстрация WYSIWYG-возможностей Xerox Star с отображением текста на корейском языке. 1981 год

Так что, проблема отображения решена? Не тут-то было. Во-первых, остается тяжелейшая проблема совместимости "чистых текстов", от которых, понятно.

никто отказываться не собирается по очень многим существенным причинам. В Word, особенно последних версий, кстати, проблема именно однобайтных кодировок решена отлично, но этого нельзя сквзать о многих других редакторах. Беспроигрышным путем пошли разработчики редактора Edit Plus, когда пользователь сам подбирает шрифт в нужной кодировке — безупречно работающим, но крайне неудобным на практике. Но наилучший способ применили еще в начале 80-х гг. разработчики упоминавшегося в главе I эпохального компьютера Xerox Star. Они ввели двухбайтную кодировку, которая должна была охватить все существующие языки (рис. 8.1). Эта идея и оказалась наиболее жизнеспособной, а если вернуться к Брайлю— она есть не что иное, как модернизированная идея ЕБсаре-переключателсй, т. е. переключателей, действующих не до отмены, а только на единственный следующий символ.

Источник: Ревнч Ю. В.  Нестандартные приемы программирования на Delphi. — СПб.: БХВ-Петербург, 2005. — 560 е.: ил.

По теме:

  • Комментарии