Аннотация: Приложение к главе 14 книги о Фокале (бывшая глава 15)
бывшая глава 15 ЗНАКОМИМСЯ С КОДИРОВКАМИ СИМВОЛОВ
Кодировка это способ обозначения в машине букв и цифр, а так же прочих знаков
препинания. Ранее уже говорилось, что все они обозначаются короткими целыми
числами. (Ибо ничего кроме чисел в машине и нет.) А вот сейчас пришла пора
разобраться - какими именно.
Впервые кодировки символов понадобились при их "телеграфной" передаче на
расстояние. Не будем вспоминать, как это делалось в морском флажковом телеграфе
или в азбуке Морзе - то что нас интересует началось с изобретения в 1872 году
французским инженером Бодэ телеграфного кода его имени и "старт-стопного"
принципа его передачи. (Который интересен и сам по себе.)
В телеграфном аппарате Жана Мориса Эмиля Боде имелся манипулятор в виде
пяти кнопок, комбинации которых и означали разные буквы. При этом фактически
получалось пятибитное двоичное число. Биты передавались последовательно и
занимали равные временные интервалы. Всего их было семь: сначала в течении
одного интервала передавался высокий уровень сигнала, что означало "старт" - он
запускал отсчет таких-же интервалов на приёмном конце. В каждом из следующих
пяти интервалов передавалось значение одного из битов кода символа. И в
последнем интервале - "стоповом", сигнал на линии должен был отсутствовать.
(Т.е. следующий "стартовый" сигнал должен быть послан не раньше, чем завершится
вот этот межсимвольный промежуток. А позже - хоть на пол года.) Основная идея
здесь в том, что хотя временные интервалы на передающем и на приёмном конце
отмеряются несколько по-разному, но за 7 - 10 штук просто не успевает набежать
существенное расхождение (порядка половины одного интервала). А для каждого
следующего символа момент, от которого следует их отмерять, указывается
по-новой. Сейчас этот принцип широко используется. В т.ч. в таком устройстве
как компьютерный ком-порт.
Для ускорения передачи сообщений (ради чего Боде собственно и старался - его
целью было изобретение не кодировки а способа уплотнения телеграфного канала)
приспособились передавать телеграммы не непосредственно в линию (вручную -
медленно), а сперва набивать передаваемый текст на промежуточный носитель -
перфоленту (а уж потом...), которая с появлением вычислительных машин
естественным образом превратилась в машинный носитель информации.
Пятибитное двоичное число даёт 2^5 = 32 комбинации (включая и нулевую, при
которой ни одна из кнопок не нажата) что для обозначения всех латинских букв
впринципе достаточно. Но так как требуются еще цифры и знаки препинания, то
пришлось сделать наборы символов переключаемыми, а одну из комбинаций
использовать как команду замены символьного набора. (Сейчас об этом говорят как
о "переключении регистров".) Пятибитный трёхрегистровый код МКТ-2 используется
в телеграфии до сих пор. Первый регистр содержит латинские буквы, второй (на
тех же самых местах) соответствующие им русские, а третий - остальные русские
буквы, цифры и знаки препинания. Пробел, коды "возврата каретки" (ВК),
"перевода строки" (ПС) и команды переключения регистров - для всех трёх
регистров общие. В наборе русских букв нету буквы Ё и твёрдого знака, а вместо
буквы Ч (для которой места тоже не хватило) используют сходную по написанию
цифру 4. Порядок символов кажется безсистемным, но на самом деле он
оптимизирован под удобство набора на пятикнопочном манипуляторе. (Хотя с
появлением у телетайпа такой же клавиатуры как у пишущей машинки это стало
несущественно.)
┌<рус> ┌<пробел>┌─<ВК> <цифр>─┐ <лат>─┐
лат: ┼ E ┬ A└┬ S I U ┼ D R J N F C K T Z L W H Y P Q O B G ┼ M X V ┼
рус: ┼ Е ┼ А ┼ С И У ┼ Д Р Й Н Ф Ц К Т З Л В Х Ы П Я О Б Г ┼ М Ь Ж ┼
цифр: ┴ 3 ┼ - ┴ ' 8 7 ┴ ┬ 4 Ю , Э : ( 5 + ) 2 Щ 6 0 1 9 ? Ш ┴ . / = ┴
│ │ └─<ПС> │ │ └<кто_там?> │ │ │ │
0 1 2 3.......7 8 9 10........15........20........25........30.
Для Фокала этот набор символов к сожалению не подойдёт: вместо точки с запятой
конечно можно приспособить двоеточие, но нет знаков для операций умножения и
возведения в степень. Без знака % тоже тяжко - нечем обозначить формат в
операторе Type. Да и кавычка только одна - сами кавычки не изобразить. Впрочем,
мы и не претендуем. Здесь нам интересно соответствие между русскими и
латинскими буквами - оно сохраняется и в других кодах. Кроме того именно так
расположены латинские буквы на стандартной русской клавиатуре.
Другой широко использовавшийся носитель информации (по крайней мере в первые
двадцать лет существования вычислительной техники) - перфокарты. Связанные с
ними кодировки носят несколько неприличное название ЕБСДИК (EBCDIC).
Сами перфокарты изобрели в незапамятные времена для управления различными
игрушечными (и не очень) автоматами, типа музыкальной шкатулки или жакардного
ткацкого станка, способного ткать сколь угодно сложный узоры. Как устроена
музыкальная шкатулка подробно рассказывается в известной сказке "городок в
табакерке". Там по мальчикам-колокольчикам стукают злые дядьки-молоточки. Потому
что их цепляет пришитыми к халату крючками губернатор-валик. Сам-то он якобы
добрый - никого не трогает, лежит себе на диване да с боку на бок
переворачивается. А для этого его толкает в бок царевна-пружинка... Вот
расположение крючков на валике и задаёт мелодию. Но только одну единственную.
Ну так вместо валика сделали диск, да не с крючками, а с отверстиями. Механизм
чуть-чуть посложнее а всё остальное - то же самое. А потом сделали этот диск
сменным - сначала металлическим а потом и картонным. Сочинил кто-то новую
мелодию - глядь - в музыкальном магазине она уже продаётся в виде таких вот
картонных дисков. Купил, поставил в музыкальную шкатулку на манер
грампластинки и слушай. Или пошли по почте тётушке в провинцию - пусть и она
послушает...
Американцы хотели механизировать статистическую обработку результатов
очередной переписи населения (1890-го года) - работу большую и муторную. И для
этого сделали перфокарту для чисел: картонный прямоугольник на котором поперёк
- десять позиций для пробивания отверстий. (Даже двенадцать). В какой позиции
отверстие - такая и цифра. Сконструировавший устройство для обработки таких
перфокарт выходец из Германии Герман Холерит за-одно основал фирму по
производству этих своих "табуляторов". Именно она, после ряда преобразований,
превратилась в современную IBM. (Попортившую нам всем столько крови...) Лет
через сорок - в 1928 году фирма IBM приняла новый формат 80-колоночной
перфокарты и взялась выпускать работающее с такими перфокартами оборудование.
В результате к моменту появления вычислительных машин, всё это успело стать
стандартом de-facto. Перфокарта Холерита была специализированной - разбивалась
на фиксированные зоны, под вполне конкретные данные из опросного листа -
возраст человека, его пол, количество детей, семейное положение, код места
рождения, и.т.п. А эта, новая, задумывалась универсальной: что делать с числами
в такой-то позиции указывалось табулятору с помощью коммутационной доски
(содержащей кучу гнёзд для втыкания проводов со штэкерами). А делать эти самые
табуляторы умели много чего - от арифметических операций (например суммирование
с накоплением результата) до сортировки перфокарт по сложному набору признаков.
Ежели считать, что подобная перфокарта это строка некоторой бухгалтерской
ведомости, то было-бы логично чтобы там же была указана и фамилия субъекта, к
которому информация в этой строке относится. Например чтобы при необходимости
можно было эту ведомость распечатать на бумаге. Благо пишущие машинки, в т.ч.
электрические, к тем временам уже довольно давно стали предметом канцелярского
ширпотреба. Вот тут и пригодились две дополнительные позиции. Но обозначать
буквы решили тем же самым способом что и цифры - в якобы десятичной системе
счисления - с помощью одной единственной пробивки в колонке (в позиции
соответствующей цифры), указав что это не цифра пробивкой в одной из
дополнительных позиций. Но двух дополнительных позиций для этого недостаточно -
букв-то в латинском алфавите 26. А третью ввести не решились - суеверные. Ну
так они задействовали под это дело еще и позицию цифры ноль - благо она верхняя.
То есть если пробивка только в позиции нуля - это ноль, а если есть еще одна,
то это буква с номером от 19 до 27. В качестве 27-й буквы (точнее почему-то
19-й) включили в набор символов косую черту. А одиночные пробивки в
одиннадцатой и двенадцатый позициях задействовали обозначать знак минус и
символ "&" (уж не знаю зачем он им так понадобился). Эта кодировка получила
название "BCDIC". Пока еще без буквы E, обозначающей "extended" - расширенная.
Когда наконец пришла пора буквы Е, выбранный (явно тупиковый) принцип
кодирования информации позволил, без существенного его нарушения, добавить
только строчные буквы (а эти - сделать заглавными) - отметив их тремя
комбинациями из пары пробивок в трёх вышеупомянутых верхних позициях. Но так
как этого совершенно недостаточно - требуются как минимум знаки математических
операций - далее начался форменный маразм. Заключающийся не столько в том, что
недостающие символы стали включать хаотично и безсистемно, сколько в том что
делали это по принципу "кто в лес, кто по дрова". В результате только у
америкосов получилось не мене шести не совместимых друг с дружкой вариантов, не
считая шестибитных кодировок, пытающихся (для поддержания совместимости)
сохранить порядок следования символов в этом коде. Использовавшийся у нас
вариант этой кодировки с русскими буквами известен как КПК-12. Он же, но
перекодированный в двоичную систему счисления и упакованный в восемь бит - ДКОИ.
От других (известных мне) кодировок эти ебздиковские производные кроме
безсистемности отличаются еще непомерно большим количеством управляющих
символов. (Более шестидесяти штук!) Одному Аллаху известно, зачем их туда
столько понапихали.
Ну что можно сказать? Люди делали как проще. И исключительно под себя и под
нужды текущего момента. (Именно это и есть та простота, которая хуже воровства.)
Как всегда, оказавшись в какой-то области "впереди планеты всей", американцы
наглядно продемонстрировали как именно не надо делать. Но при этом, выскочив
на рынок монополистом, навязали всем это своё далёкое от оптимума решение...
Можно конечно сказать, что первопроходцам труднее всех, что людям свойственно
ошибаться и вообще "первый блин - комом". Всё так. Вот только подобная история
повторяется раз за разом, стоит американцам стать хоть где-то даже не
обязательно первопроходцами...
Знаете как устанавливаются эти самые стандарты de-facto? А вот так - через
рынок: либо кто-то успеет захватить его в монопольное владение и напродавать
своего оборудования; либо за счет положительной обратной связи - это если на
рынок выскочили сразу несколько производителей и он разбился на сектора взаимно
несовместимых товаров. Потребителю попавшему в один из секторов (т.е. уже
купившему один из этих товаров) чтобы перебраться в другой сектор, надо
преодолеть существенный потенциальный барьер - выкинуть всё что у него уже есть,
и приобрести всё заново (в т.ч. навыки и опыт). А положительная обратная связь
в том, что чем больше сектор тем с одной стороны больше вероятность для впервые
пришедшего на рынок потребителя попасть именно в него; а с другой - тем дешевле
в нём продукция, доступнее сервис, литература и не дай бог программное
обеспечение... Поэтому с течением времени распределение рынка на сектора
меняется: самый большой сектор растёт, пока не захватит весь рынок. Но это еще
действует слабая положительная обратная связь. Когда размеры секторов
различаются уже в разы - начинает действовать более сильная: каждый из товаров
получает от общества ресурсы для развития пропорционально размеру сектора. В
результате изделие, чей сектор больше всех, развивается быстрее и постепенно
уходит в отрыв. Эта картина совершенно не зависит от качества товаров, а
исключительно от начального распределения. Вот и получается что стандартом
де-факто становится наихудший товар из работоспособных - изделие наименее
добросовестных разработчиков, стремящихся побыстрее застолбить место, первыми
выбросив на рынок плохо продуманную "сырую" дрянь. (А лохам в это время
заливают баки байками о благотворности конкуренции.)
Взять хотя бы для примера ихнюю клавиатурную раскладку "QWERTY" и сравнить с
нашей "ЙЦУКЕН" благо нынче они на одной клавиатуре. Та и другая оптимизированы
под печать всеми пальцами "вслепую". Но как! Наша сделана таким образом чтобы
максимально ускорить и облегчить набор текстов: самые нужные буквы расположены
по центру клавиатуры под самыми сильными пальцами - указательными. А
американская - чтобы максимально затруднить и замедлить - самые нужные (им)
буквы расположены по краям - под самыми слабыми пальцами - мизинцами. А дело
в том, что у первых пишущих машинок рычаги с литерами были деревянные.
Машинистки научились быстро печатать - так эти рычаги стали цепляться между
собой - следующая буква выскакивала когда предыдущая еще не успевала вернуться
на место. Вот разработчики, вместо того, чтобы заняться решением этой проблемы,
просто переставили буквы так, чтобы выровнять скорости нажатия. (Т.е. пошли по
пути наименьшего сопротивления.) И тем самым установили антиоптимальный
стандарт, от которого теперь никак не избавиться! По крайней мере самим
американцам. (Так они его, гады, пытаются навязать всем, до кого могут
дотянуться! Видимо чтобы не они одни мучались.)
Нам-то до их поганых стандартов должно быть как до лампочки: на стандартной
русской клавиатуре латинские буквы расположены так же как и русские - в порядке
"JCUKEN". И вообще - до середины семидесятых годов, пока руководство (видимо
вследствие разжижения мозгов) не взяло курс на копирование чужих достижений,
отбросивший в частности нашу вычислительную технику с передовых позиций далеко
назад - мы занимали эти самые передовые, ведущие позиции в мире, причем во
многих областях, и сами задавали стандарты (себе и всем пожелвшим
присоединиться, благо было к чему). А с американцами был паритет. И это не
смотря на то, что ресурсов (в т.ч. и для развития) у них всегда на один а то и
два порядка больше. (Впрочем ресурсы важны не во всех областях... Например
фантастика: путная фантастика как массовое явление литературы фактически была
только в двух странах - у них и у нас. А у всех остальных - только отдельные
авторы, хотя иногда просто выдающиеся - типа С.Лема. Почему так? Понятия не
имею, но это факт.)
В частности в те поры у нас применялась своя собственная единая для всех
семибитная кодировка, не имевшая какого-то особого названия. (В отличии от
американцев, склонных разводить шум по любому даже самому незначительному
поводу, и давать крикливые названия всему, чему надо и чему не надо, у нас
тогда подобного тщательно избегали...) Применительно к перфокартам она известна
как УПП (от слов "устройство подготовки перфокарт") и отличается от прописанной
в ГОСТ`е только наличием восьмого бита, используемого для контроля -
дополняющего количество единиц в коде до нечетного. Допускался единственный
"четный" байт - состоящий из всех нулей. Т.е. это место, где просто ничего не
пробито. Он всегда игнорировался. (Ну и еще возможно символ "забой" состоящий
из всех единиц - место где был (а теперь вот "забит") ошибочный символ.)
Перфокарты были те же самые, но использовались совершенно по-другому -
построчно: строчки шли слева направо и сверху вниз; каждые восемь позиций в
строке - очередной символ; самый значащий бит - самый левый, он же дополнение
до нечетности. По-максимуму получалось 120 символов на перфокарту в приличной
(удобной) кодировке вместо 80 в неприличной. Но некоторые машины могли считать
только столько колонок, какова у них разрядность машинного слова.
Кодировка сконструирована так, чтобы её можно было использовать и в
шестибитном варианте - первые 63 кодовые комбинации уже содержали набор
символов, годный практически для всех применений. (По крайней мере Фокалу их бы
вполне хватило.) И даже при усечении до четырёх (!) бит оставался минимально
необходимый набор символов для записи числовых данных: цифры, знаки "плюс",
"минус" и "косая черта". А так же точка, запятая и пробел - вот именно в таком
порядке. При этом цифра ноль имеет код ноль, а цифра девять - код девять.
Следующие шестнадцать кодов - математические символы (включая такие, которые в
более поздних кодировках уже не сыскать) и знаки препинания. Не все. Но два
вида скобок и обе одинарные кавычки - правая и левая. (А практически во всех
"более современных" кодировках неизменно присутствует только одна.)
Следующие 31 позиция - русские буквы в алфавитном порядке, но без твёрдого
знака и, разумеется, без буквы ё. Последний 64-й код оставлен свободным (под
"забой") и сделано так, чтобы буква Я на него не попала. В результате на него
попала буква D-латинская. Вторая половина кодового пространства заполнена
недостающими символами. Начиная с латинских букв, написание которых не
совпадает с русскими - тоже в алфавитном порядке. Присутствует там много чего,
включая твёрдый знак и даже две линии - горизонтальная и вертикальная - для
рисования на экране таблиц и прочих рамочек. (В качестве соединительного
элемента на их пересечении видимо предполагалось так же как и на пишущей
машинке использовать знак +.) Есть так же буквально несколько управляющих
символов. (Обратим внимание - в отличии от телеграфной кодировки, содержащей
две отдельные команды ПС и ВК, здесь только один символ, завершающий строку.
Т.е. это действительно признак конца строки, а вовсе не команда для некоего
устройства типа телетайпа.) А вот вопросительного знака в этой кодировке
странным образом нет. Хотя незанятых кодов (чтобы его можно было ввести) -
более чем достаточно.
Изобразить эту кодировку не берусь - в той, которой пишется этот текст,
самых интересных её символов просто нет. Некоторые конечно можно заменить на
имеющиеся (например "не-равно" на # ("диез") который вообще-то эквивалентен
вовсе не ему, а символу "номер"), а некоторые - увы.
Как видим, кодировка продумана существенно лучше чем известные на тот
момент американские. Причем наши позаботились не только о своём, но и о
латинском алфавите. Правда - по "остаточному" принципу, но это вовсе не
недостаток, а скорее наоборот. Единственно, латинские буквы добавлены не по
фонетическому, а по "графическому" принципу - при дополнении этой кодировки
строчными буквами возникли бы перекосы, т.к. совпадения и несовпадения написания
со строчными русскими у них другие.
Но до этого, к сожалению так и не дошло - следующие стандартные кодировки
стали строить на базе импортных образцов. (Ну я же говорю - явное разжижение
мозга.)
Этот самый импортный образец, ставший нынче повсеместно стандартом de-facto,
известен как кодировка ASCII. Тоже кстати семибитная. Устроена она так: всё
кодовое пространство делится на страницы по 32 символа.
Нулевая страница - управляющие (они-же "слепые") символы - графических
изображений для них нет. Некоторые отрабатываются терминалом или принтером
(ВК, ПС, ГТ, ВТ, ПФ, ВШ, ЗВ, РУС, ЛАТ, ESC), остальные - непонятно зачем. По
мне так просто зря место занимают - что-то я не припомню чтобы хоть где
ни будь они использовались для пользы дела.
Страница номер 1 - пробел, цифры, и прочие значки, включая знаки препинания.
Номер 2 - заглавные латинские буквы; номер 3 - строчные. Места под русские
буквы, как видим, просто нет. Но о своих европейских коллегах американцы
всё-же немножко позаботились, заявив, что коды, оставшиеся в конце страниц 2 и
3 (по 5 штук) можно занять под специфические буквы национальных алфавитов.
(О своих "специфических символах" они позаботились в первую очередь - включили
никому кроме них не нужную "коммерчесскую-ЭТ" - букву А-маленькая в кружочке,
она же "Абезьяна" или "сАбака", первой - перед остальным алфавитом. Видимо чтобы
никто на что-то своё специфическое не заменил.) Немцам под буквы с "умляутами"
и "гросе-S" похожую на греческую "бета", а так же скандинавам с их странными
буквами пяти символов впринципе хватит (но отнюдь не всем вместе - у каждого
будет свой собственный вариант), а французам с чехами и поляками, и прочим
эсперантистам - нет. Последние еще могут выкрутиться, используя вместо
U-краткого ненужную букву W, а все остальные - увы. Впрочем это место
американцы всё равно не оставили свободным, а заполнили скобками разных видов и
другими символами, которые авторы алгоритмических языков быстро пристроили к
делу. Поставив немцев со скандинавами перед дилеммой: либо Си с Паскалем, либо
имена объектов, "говорящие" на родном языке.
конец_строки
верт.таб─<ВТ>───────┼─┐ ┌─┼─────<ПФ>─"прогон_формата"
<ПС>─┤ │ │ ├─<ВК>
гориз.таб─<ГТ>─────┐ │ │ │ │ <не_использ>─┐
шаг_назад─<ВШ>───┐ │ │ │ │ │ ┌───<РУС>─┬переключение ┌─ │
<пробел>─┐ звонок─<ЗВ>─┐ │ │ │ │ │ │ │ ┌─<ЛАТ>─┘ регистров │ │
0──│- - - - - - - * * * * * * * # # - - - - - - - - - - - * - - - - │
1──└ ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? │
2── @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ │
3── ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~ │
│ │ │ │ │ │ │ └─┘
0 1 2 3 . . . . . . 10. . . . . . . . . 20. . . . . . . . . 30.
Наши из этого сделали группу кодировок, известных как "КОИ". Причем в
трех вариантах: КОИ-7 - семибитная, для случая когда достаточно только
заглавных букв; КОИ-8 - восьмибитная - полный вариант; и нечто промежуточное
между ними, для случая, когда аппаратура (дисплей, принтер) отображает все
какие надо буковки, но канал передачи данных остаётся семибитным. (Такой
аппаратуры было полным-полно.) В этом третьем случае используется переключение
регистров, благо ни для чего не нужных управляющих кодов в этой кодировке
более чем достаточно.
В КОИ-7 заглавные русские буквы поместили в третью страницу вместо маленьких
латинских, причем по принципу фонетического соответствия. (Так же как и в
телеграфном коде.) Буквой Ё опять пожертвовали, впрочем как и твёрдым знаком,
приходящимся на последний код, используемый в большинстве систем для служебных
целей. (Под код "забоя", для обозначения конца строки, конца файла, и.т.п.)
2── @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _
3── Ю А Б Ц Д Е Ф Г Х И Й К Л М Н О П Я Р С Т У Ж В Ь Ы З Ш Э Щ Ч Ъ
│ │ │ │ │ │ │
0 1 2 3 . . . . . . 10. . . . . . . . . 20. . . . . . . . . 30.
В полной восьмибитной кодировке КОИ-8 первые 128 символов совпадают с ASCII,
а вторые (отличающиеся единичкой в старшем бите) на месте латинских букв
содержат русские - в том же самом порядке, что и в КОИ-7. Т.е. на месте
латинских больших (заглавных) русские маленькие (строчные) и наоборот.
Промежуточный вариант (тот, который с переключением регистров) получается из
КОИ-8 элементарно: драйвер устройства должен помнить, какой у него там включен
регистр и проверять на соответствие ему старший бит каждого очередного
передаваемого байта (который при передаче всё равно потеряется). Буде не
соответствует - посылать перед ним команду включения соответствующего регистра.
Но, как правило, лентяйским методом - только для букв (т.е. если второй с краю
бит не ноль) - цифры и служебный символы для обоих половин кодовой таблицы
считались совпадающими.
То есть в ГОСТе-то был описан совсем полный вариант, в котором в начале
второй половины кодовой таблицы - некоторые полезные значки (включая букву Ё) и
псевдографика. (Да не как у писишки, а систематически - сначала одинарная,
потом двойная, потом смешанная - в едином, общем для всех четырёх наборов
порядке.) Но оборудование всё это, увы, как правило не отрабатывало. Ну так
чего-же стараться?!
Несмотря на отсутствие буквы Ё и неалфавитный порядок следования русских
букв (а значит трудности с сортировками), а так же отсутствие возможности
позаботиться о братьях-славянах, эта кодировка была вполне ничего. В том числе
и в плане устойчивости к сбоям аппаратуры: при путанице с регистрами надписи
всё равно оставались вполне читабельными. До сиих пор существенная часть
документации по UNIX`у имеет хождение именно в этой кодировке...
Следующий акт марлезонского балета начался вместе со следующим этапом
политического маразма - распространением с самых верхов деструктивных идей,
внедрение которых в человеческое сознание привело к краху всего, что только
можно - от реактора Чернобыльской АЭС до экономической и политической подсистем
нашей страны включительно. По несчастью всё это совпало с очередным этапом
всеобщей компьютеризации, известным как "бум персональных ЭВМ". Как и на
предыдущем этапе, вместо того чтобы развивать свои (в т.ч. совершенно
выдающиеся) образцы - взялись сдирать и закупать чужие. Но если на предыдущем
этапе, хотя бы иногда выбирали с умом и делали всё-таки всё сами, и поэтому,
пусть и с большими потерями, удалось как-то выплыть, то на этом - уже нет.
И наступили писишные времена...
А сляпавшие на скорую руку это @#$%&* pазработчики фирмы IBM решили в нём
наконец применить восьмибитную кодировку. Я так понимаю, что им понадобилось
место под символы псевдографики.
Псевдографика используется для изображения на экране всяческих рамок и таблиц.
И включает элементы для рисования горизонтальных и вертикальных линий, а так
же их стыковки и/или пересечения. Машинистки испокон веку использовали для
этих целей символы восклицательный знак, минус и плюс. Но эти деятели
размахнулись сделать не только одиночные, но и двойные линии. Так что символов
псевдографики им понадобилось ровно сорок штук: четыре символа которыми
рисуются сами линии и четыре комплекта по девять штук для стыковки линий между
собой:
┌─┬─┐ ╔═╦═╗ ╓─╥─╖ ╒═╤═╕
─ │ ═ ║ ├─┼─┤ ╠═╬═╣ ╟─╫─╢ ╞═╪═╡ ░ ▒ ▓ █ ▄ ▌ ▐ ▀
└─┴─┘ ╚═╩═╝ ╙─╨─╜ ╘═╧═╛
К этому добавили четыре символа с разной фактурой для заполнения пространства, а
так же четыре наполовину закрашенных знако-места (понятия не имею зачем) и в
результате получилось ровно полторы странички - 48 штук. Вот их и впихнули
посередь второй 128-символьной половины кодового пространства, заполнив
оставшееся свободным место теми самыми крякозябрами, в которые нынче
превращается текст, стоит напутать с кодировкой. Первая половина кодового
пространства, ясный пень, осталась всё той же ASCII. И называется это у них
CP-437.
Казалось-бы - оставшегося места (две с половиной страницы) более чем
достаточно для размещения чего угодно. И в 1987 году был принят ГОСТ с новой
кодировкой. (А старая, что, вместе с оборудованием на свалку? А если нет, зачем
путаницу устраивать?!) Первая половина, как и в КОИ-8 совпадала с ASCII; русские
буквы располагались во второй, но в отличии от КОИ - в алфавитном порядке. При
этом проблема буквы Я была решена следующим оригинальным образом:
буквы сместили на пол страницы вверх. То есть сначала идут полторы страницы
псевдографики (но не систематически, как в самой полной КОИ-8, а так-же
хаотично как в оригинальной писишной кодировке), а после неё сразу русские
буквы. В результате в конце остаётся еще пол страницы (16 кодов) заполненных
разными всякими дополнительными значками, последний из которых - самый ненужный
и приходится на этот самый код 0xFF.
Вот не покупали-бы всякую импортную фигню, а делали-бы сами (пусть даже
фигню еще большую) и проблем никаких бы небыло! Помнится Рональд Рейган -
второсортный голливудский актёр, под занавес своей карьеры сыгравший в
реалити-шоу роль американского президента, призывал американцев продать (или
даже подарить) русским столько писишек, сколько коробок они смогут распаковать.
Слова-то ему совсем не дураки писали...
Как всегда оказалось, что американцы положили свинью. И не одну. В
частности оказалось, что в их изделиях позиция псевдографических символов
зафиксирована аппаратно! Так, что на какое-то другое место передвинуть их
невозможно. А расположены они как раз там, где наши хотели расположить
русские буквы - на полторы странички вниз от начала второй половины кодового
пространства. (Типа - разместите заглавные буквы в начале, а строчные - в
конце, и живите без буквы я.)
Поэтому в том же самом ГОСТ`е нашим пришлось ввести еще одну "альтернативную"
кодировку. Там псевдографика осталась на аппаратно-зафиксированном месте;
большие русские буквы расположены с самого начала, а маленькие сразу вслед за
ними, но только первые 16 штук. А остальные - после символов псевдографики.
Проблему буквы Я обошли, но строчные буквы получились разрывными. Это и есть
т.н. ДОС`овская кодировка, она-же CP-866.
4──А Б В Г Д Е Ж З И Й К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Ъ Ы Ь Э Ю Я
5──а б в г д е ж з и й к л м н о п ░ ▒ ▓ │ ┤ ╡ ╢ ╖ ╕ ╣ ║ ╗ ╝ ╜ ╛ ┐
6──└ ┴ ┬ ├ ─ ┼ ╞ ╟ ╚ ╔ ╩ ╦ ╠ ═ ╬ ╧ ╨ ╤ ╥ ╙ ╘ ╒ ╓ ╫ ╪ ┘ ┌ █ ▄ ▌ ▐ ▀
7──р с т у ф х ц ч ш щ ъ ы ь э ю я Ё ё Є є Ї ї ? ? R ∙ ? √ ? ? ■ ├─┐
│ │ │ │ │ │ │ │
0 1 2 3 . . . . . . 10. . . . . . . . . 20. . . . . . . . . 30. │
<не_использ>─┘
Еще одна оригинальная, но малоизвестная кодировка, где русские буквы
расположены полностью в алфавитном порядке, была придумана в Минском НИИ ЭВМ.
(Том самом, где сначала были разработаны одни из лучших и при том самые
массовые в Союзе машины серии Минск, а потом содрана (в качестве серии ЕС)
отстойная, зато имевшая небывалый коммерческий успех IBM-360, что и отбросило
нашу вычислительную технику лет на двадцать назад.)
Там под заглавные и строчные буквы выделено по полторы страницы в начале и
в конце второй половины кодового пространства. Перед ними, так же как и в
ASCII перед латинскими буквами, добавлен полезный значёк (номер перед
заглавными и "денежка" (она же "солнышко", "бычок" или даже "сквотерёжка")
перед строчными. А после - по четыре дополнительных символа псевдографики:
стрелки после заглавных и диагональные уголки - после строчных (таких нет
даже в уникоде). По-разному закрашенные знако-места собраны в одном месте, а
на освободившееся пространство перенесена псевдографика с того места, где
мелкие русские буквы. А остальная - оставлена где была.
┌─номер ┌стрелки для сравнения - CP-866
4─ ┴ А Б В Г Д│Е Ё Ж З И Й К Л М Н 4──А Б В Г Д Е Ж З И Й К Л М Н О П
О П Р С Т У│Ф Х Ц Ч Ш Щ Ъ Ы Ь Э Р С Т У Ф Х Ц Ч Ш Щ Ъ Ы Ь Э Ю Я
5──Ю Я ├─┴─┴─┴┘? ? ╨ ╤ ╥ ╙ ╘ ╒ ╓ ╫ 5──а б в г д е ж з и й к л м н о п
╪ ┘ ┌ │ ┤ ╡ ╢ ╖ ╕ ╣ ║ ╗ ╝ ╜ ╛ ┐ ░ ▒ ▓ │ ┤ ╡ ╢ ╖ ╕ ╣ ║ ╗ ╝ ╜ ╛ ┐
6──└ ┴ ┬ ├ ─ ┼ ╞ ╟ ╚ ╔ ╩ ╦ ╠ ═ ╬ ╧ 6──└ ┴ ┬ ├ ─ ┼ ╞ ╟ ╚ ╔ ╩ ╦ ╠ ═ ╬ ╧
┌───┤ а б в г д е ё ж з и й к л м н ╨ ╤ ╥ ╙ ╘ ╒ ╓ ╫ ╪ ┘ ┌ █ ▄ ▌ ▐ ▀
│7──о п р с т у ф х ц ч ш щ ъ ы ь э 7──р с т у ф х ц ч ш щ ъ ы ь э ю я
│ ю я ├─┴─┴─┘ ░ ▒ ▓ █ ▄ ▌ ▐ ▀ ■ Ё ё Є є Ї ї ? ? R ∙ ? √ ? ? ■
└денежка└─диагональные линии
Аппаратная фича, закрепляющая псевдографику на фиксированном месте
заключается вот в чем:
Надеюсь, ни для кого не секрет, что ПЭВМ это в очень значительной степени
гипертрофированный дисплей (и соответственно центральная его часть это
видеоадаптер, а вовсе не процессор с памятью)? Что основная часть ресурсов ПЭВМ
расходуется на организацию интерфейса с пользователем, а все остальные задачи
решаются в ней по остаточному принципу? Правда ресурсов этих нынче так много,
что перед разработчиками стоит серьёзная проблема - куда бы их так потратить,
чтобы это было не столь заметно. Знающие люди даже подозревают заговор между
производителями железа и системного программного обеспечения, с целью
раскрутить пользователя на бабки. Для этого новые программы злонамеренно
делаются так, чтобы на старом железе они еле ползали. И тем подвигали
пользователя к смене аппаратуры на более производительную. Старые программы при
этом должны стать "не модными". Что достигается в т.ч. превентивным внедрением
неопасных, но по-возможности неприятных для пользователя ошибок, чтобы их
последующим устранением обосновать необходимость перехода на следующие версии,
фактически не отличающиеся ничем кроме дизайна, и особой прожорливости.
А совсем старые, которые на этом железе будут просто летать, делаются частично
(а то и в значительной степени) неработоспособными путем накопления малозаметных
несовместимостей. Или правильно работают только под специальным эмулятором,
тщательно следящим, чтобы оно было только чуть лучше чем раньше.
Впрочем это вполне типичное проявление одного из базовых дефектов "общества
с обменом ресурсами". По мере роста производительности труда - этого самого
труда на удовлетворение уже имеющихся потребностей нужно всё меньше и меньше,
что казалось-бы хорошо: можно меньше работать. Или направить высвободившийся
труд на решение новых, ранее недоступных задач - на науку, искуство, освоение
космоса, да хоть на строительство пирамид! В обществе "со сложением ресурсов"
так оно и есть. А в обществе "с обменом ресурсами" наступает перепроизводство,
и те, результаты чьего труда невостребованы, оказываются в буквальном смысле
перед угрозой голодной смерти - и это в условиях избытка ресурсов всех видов,
в том числе и продовольствия! Один из выходов - изобретение и внедрение
(буквально навязывание) всё новых и новых фиктивных потребностей. Другой -
"программируемый износ" - политика делать вещи быстроизнашиваемыми,
неремонтопригодными, одноразовыми... Следствие того и другого - эррозия среды
обитания - всё ускоряющийся процесс переработки первичных ресурсов планеты
(далеко не безграничных) в мусор и отходы. Впрочем мы отвлеклись.
Так или иначе, но видеоадаптер - центральная часть персоналки. А режимы его
работы (коих нынче развелось как собак нерезаных) делятся на две большие
группы - "текстовые" и "графические". (Графические впринципе бывают "растровые"
и "векторные", но последних сейчас уже не сыскать - вымерли как мамонты.)
В графических (расстровых) режимах изображение формируется из отдельных точек.
Точки стоят стройными рядами - например 640 точек по горизонтали и 480 - по
вертикали. И можно (надлежит!) персонально указать яркость (цвет) каждой из
них. Тогда и получится изображение. Очень трудоёмко, зато полная свобода
сновидений. В текстовых режимах всё гораздо проще: видеоадаптеру указываются
коды символов для каждого знако-места, а символы он рисует сам. Рисует,
разумеется тоже по точкам - монитор на который это всё выводится - один и тот
же. Типичный размер экрана - 25 строк по 80 символов в строке; а типичная
матрица символа - 8 на 8 точек. Или 8 на 14 или даже 8 на 16. Восемь - это по
горизонтали. Казалось бы - в формируемой видеоадаптером строке будет всё те же
самые 640 точек... А вот и нет - 720! Хитрый видеоадаптер делает после каждого
символа промежуток. Но тогда линии псевдографики получатся разрывными? Да, но
не везде: для того диапазона символов, в котором находится псевдографика в
оригинальной писишной кодировке, промежуток заполняется дублированием крайнего
столбца матрицы символа. А так же нижней строки - промежутки делаются и по
вертикали. И не предоставляется никаких средств сдвинуть этот диапазон в
желательном направлении.
Следующую кодировку подсуропила нам мелкомягкая контора (специализирующаяся
на оказании медвежьих услуг человечеству) в процессе разработки винды. Нам
сейчас несущественно, что, как говорят злые языки, эту свою графическую
надстройку над ДОС`ом они слизали у своих яблочных конкурентов, а придумала
оконный интерфейс вообще фирма Ксерокс... Главное - буковок в графическом
режиме можно понарисовать очень много, поэтому для их кодировки отвели сразу
два байта на символ. Не знаю точно, как происходил полёт мелкомягкой мысли,
но вроде бы сперва они решили тупо поместить в один байт код самого символа в
одной из существующих национальных кодировок, а в другой - номер этой
кодировки. Если бы они на этом и остановились, то всё бы ничего... Но
национальных кодировок многие десятки, если не сотни, а отличается
большинство из них друг от дружки всего несколькими символами. Видимо хранить
все эти десятки/сотни почти не различающихся наборов картинок даже для них
на тот момент оказалось слишком круто. И мелкомягкие взялись всё это
унифицировать. (Благо псевдографика графической оболочке вроде как никчему -
можно использовать занимаемое ею место.) Но на свой специфический манер. Не
знаю, что они сотворили для пользующихся латиницей, но для кириллицы, при
поддержке местных ренегатов, они засунули русские буквы в две последние
страницы второй половины кодировки. (А в первые две распихали как попало
всякие экзотические буковки, употребляемые в славянских языках.) И вот вам
пожалуйста проблема буквы Я в полный рост! (Ей богу - убил бы гадов!!)
Это вот и есть "виндовая" кодировка, она же CP-1251.
Впрочем сейчас (по прошествии четверти века!) проблема буквы Я более-менее
разрешена - путём "русификации" программного обеспечения, включающей в себя
в том числе и устранения особой роли символа с кодом 0xFF. Так что теперь этой
кодировкой в большинстве случаев вполне можно пользоваться. (Можно но
осторожно.)
Международная организация по стандартизации ISO попыталась навести в этой
области хоть какой-то порядок - разработала стандарт ISO-8859, где ввела этих
кодировок аж шестнадцать штук. (Только индийский алфавит деванагари ISO-8859.12
что-то забросила, не доведя до.) Для кириллицы - ISO-8859.5 - там русские буквы
в точности в том же самом месте, что и в ГОСТ`овской "основной" кодировке. Т.е.
со сдвигом на полторы страницы. А две по пол-страницы перед ними и после
заполнены дополнительными буковками для братьев-славян. Одна - заглавные,
а вторая - такие же в точности, но строчные. Буква Ё ес-сно тоже там - вторая
с краю. А что в самом начале - не определяется. Видимо подразумевается, что
управляющие символы, те же самые в точности что и в ASCII.
В общем-то получилось вполне логично, и даже с ГОСТ`ом умеренно совместимо.
(Разве что буква Ё в другом месте.) Вот только что-то я не видел чтобы эта
кодировка где-то всерьёз использовалась. Хотя в "уникод" символы кириллицы
вошли именно в таком виде...
Что такое "уникод"? А вот небыло ни гроша, да вдруг алтын! Явная
гигантомания - попытка закодировать ВСЕ символы, какие вообще только есть.
Существует оно в трёх формах, известных как utf-8, utf-16 и utf-32 и
кодируемых одно, двух и четырёх-байтными словами соответственно. А эволюционно
вроде бы развилось из двухбайтовой виндовой кодировки, каковая и превратилась
в utf-16.
Сперва мелкомягкие вроде-бы (вполне справедливо) посчитали что 64 тысячи
(2^16) кодов должно хватить абсолютно на всё. Но потом, когда всё уже было
сделано, вдруг испугались что для особо редких китайских иероглифов может и не
хватить... (Но скорее спохватились, что нету задела для следующих версий.)
И решили этот диапазон расширить. Путём кодирования некоторых символов двумя
(!) шестнадцатиразрядными словами. (Так называемыми "сурогатными парами".)
Сделано это так: там, в двухбайтной виндовой кодировке, примерно 1/8 часть всего
диапазона кодов (т.е. 2^13 штук) отведена под "символы пользователя" (почему-то
с 0xD800 по 0xF8FF включительно) - чтобы пользователь мог сам сопоставить им
какие захочет картинки. Ну так в их начале выделили два отрезка по 2^10 штук
(с 0xD800 по 0xDFFF); двадцатиразрядное двоичное число делят на две половинки
и засовывают их - старшую часть в первое слово сурогатной пары (из первого
поддиапазона), а младшую часть - во второе. В результате к имеющимся 2^16 кодов
добавилось еще 2^20 ценой выпадения 2^12 штук. А главное - ценой отказа от
"равномерности" - ну символы-то теперь разной длины! Все алгоритмы обработки
текстовых строк резко усложняются (чего видимо и добивались).
Таким образом пространство кодов получилось порядка миллиона. В настоящий
момент из них занято всего лишь около ста десяти тысяч. Причем запихнули туда
абсолютно всё, что только смогли найти, включая редко и очень редко используемые
китайские иероглифы. И вряд ли найдут еще чего добавить. Разве что инопланетяне
со своими оригинальными видами письменности прилетят.
Сверхрасточительная кодировка utf-32 предполагающая тупо засунуть двадцати с
небольшим битный номер символа в тридцати двух разрядное слово, разумеется по
прежнему равномерная. Шестнадцатиразрядная utf-16 была-бы равномерной, но эти
самые "сурогатные пары" всё портят (для того и придуманы). Впрочем в виде
исключения для старых программ... можно таки считать её равномерной, т.к. все
реально необходимые символы (и все символы, которые хотя бы теоретически могут
хоть для чего ни будь пригодиться) размещены в первой "плоскости" - исходном
пространстве размером в 2^16 символов. Дело, кстати, еще осложняется тем, что
записываться (или передаваться) шестнадцатиразрядные слова (как впрочем и
32х-разрядные) могут как вперёд старшим байтом, так и младшим. Чтобы различить
эти две ситуации утф-овские тексты как правило начинаются с одного и того-же
кода 0xFEFF, обозначающего "неразрывный пробел нулевой ширины". В utf-8,
отличающуюся относительной экономичностью, где к тому же подобной проблемы
просто нет, этот самый "неразрывный пробел" всё равно вставляют. (Может чтобы
можно было отличить, какой именно код?) Устроена utf-8 так: байт, у которого
старший бит равен нулю - 0ххххххх - обычный код ASCII; байт вида 10хххххх - это
продолжение многобайтного символа, несущее очередные шесть бит; байты вида
110ххххх, 1110хххх, 11110ххх, и.т.п. - это первый байт такой многобайтной
последовательности, состоящей из двух, трёх, четырёх... Вот сколько у них там в
начале единичек, столько и байт (включая его самого). А то что здесь обозначено
как хххх - очередные биты кода символа. (В первом байте - самые старшие.) Всего,
если по-максимуму - в семи байтах 36 бит. Но больше четырёх байт на символ - для
самых редких иероглифов - не используется.
Ну что можно про всё про это сказать?
Комитет ANSI похоже прицеливался сделать двенадцатибитную кодировку для всех
систем буквенной (и некоторых - слоговой) письменности. (16=2^4 восьмибитных
кодировок - всё вместе как раз 12 бит.) Но не преуспел. Потому что с одной
стороны пытался угодить всем и сразу, сохраняя совместимость с тем, что
наработано до него. А с другой - был выбран неподходящий для данной задачи
принцип "типографского" соответствия символов разных языков. Т.е. их кодировки
наиболее приспособлены для того, чтобы фиксировать не то что хотел сказать
пишущий, а как это им написанное будет выглядеть. А в уникоде этот принцип
доведён до абсурда. И вообще, такое впечатление, что уникод затеяли те самые
растратчики (наших!) вычислительных ресурсов... То есть, исходя из общих
соображений, конечно совсем не вредно иметь общий глобальный перечень всех
символов всех языков. Вот только для практических целей он максимально
неудобен - излишняя универсальность всегда и везде выходит боком, заставляет
нести непомерные накладные расходы. В частности многократно увеличивается
расход памяти и/или во много раз усложняются все алгоритмы обработки текстов.
(Такое подозрение, что ради этого всё и затеяно.) Кроме может быть простого
отображения. Да и то - хранить порядка ста тысяч (!) изображений входящих в
уникод символов просто нереально. (А точнее - столько комплектов, сколько
разных шрифтов...) Да и не нужно - в силу невозможности всё это применить.
Человеку, пользующемуся не иероглифической письменностью, вряд ли удастся
употребить и даже просто запомнить более тысячи символов. (Китайцу надо на
порядок больше, но для них требуется принципиально другая система кодирования.)
В частности с докомпьютерных времён известен принятый в СССР т.н. "суммарный
алфавит" - символьный набор, построенный тоже по "типографскому" принципу и
включающий всего около 400 букв, цифр и лигатур (как заглавных так и строчных),
в т.ч. со всеми возможными диакритическими знаками. Он позволял набирать тексты
на 90 языках, практически на всех, использующих кириллицу и латиницу.
(В уникоде для тех же самых целей - 652 символа.)
Справедливости ради следует всёже заметить, что в utf-8 первый (или
единственный) байт символа вполне можно отличить от байтов его продолжения.
(В utf-16 - то же самое, хотя и для двухбайтовых слов.) Следовательно
использовать Си-шный стиль работы с текстовыми строками (с помощью указателя,
указывающего куда-то на её середину) по прежнему можно. Разве что придётся
постоянно вызывать некую функцию, проверяющую - на первый ли байт символа оный
указатель указывает, и если нет - сдвигающую его в соответствующую сторону...
Для полноты картины надо-бы еще вспомнить такой код Radix-50. Использовался
в ранних (импортных) операционных системах (например в RT-11 и её аналогах) для
хранения имён файлов. Или вот еще - имён переменных в объектном файле. Ни для
чего больше не годился, т.к. кодировал всего 40 символов: пробел, латинские
буквы, символ доллара, точку, некий резервный символ (ей богу не помню что было
на этом месте) и десятичные цифры - вот именно в таком порядке. Зато упаковывал
три символа в два байта. За счет того, что 40*40*40 это ровно 64 тысячи -
чуть-чуть меньше чем 2^16. Тоесть брался первый символ и умножался на 40;
прибавлялся второй и это тоже умножалось на 40, после чего прибавлялся третий.
Извлекались в обратном порядке - взятием остатка от деления. А причем тут 50?
Десятичное число 40 в восьмеричной системе счисления как раз и будет 050.
В общем "нэ так надо это дэлатъ, савсэм нэ так"! А вот как:
Во-первых для языков использующих фонетический (в т.ч. и слоговый) и
иероглифический принципы организации письменности, надлежит сделать разные
системы кодирования. Во-вторых для языков с фонетическими системами письма
всё пространство кодов, предназначенных для обозначения используемых ими
символов разбить на страницы не по 32, а по 64 символа. (Причем по одному, или
даже по два символа с каждого края зарезервировать для технических целей.)
В-третьих все языки разбить на алфавитные группы - т.е. использующие
кириллицу, латиницу, арабское письмо, грузинское письмо, и.т.п. Для каждого из
таких алфавитов выделить одну или две страницы - в зависимости от того,
различают они заглавные и строчные буквы, или нет. (Некоторым алфавитам можно
выделить даже по пол страницы!) В-четвертых - произвести исследование, в
результате которого для каждой алфавитной группы языков должен быть построен
минимально необходимый набор символов. Для каждого языка группы определить
минимально необходимый набор дополнительных букв. Буква должна в него
включаться только если в этом языке есть слова, где она играет
смыслоразличительную роль, а не просто передаёт особенности произношения.
В качестве примера: в русском языке сейчас лишних букв нет.
Смыслоразличительную роль играют все, включая букву Ё (хотя ею часто и
жертвуют). Однако встречается этакий придыхательный звук, средний между Г и Х.
Он особенно характерен для диалектов украины Малоросийской. В Эсперанто буква h
именно такой звук и обозначает. А обычная непридыхательная Г (характерная для
украины Залесской - нынешней центральной части страны) там считается "более
шипящей", пишется как "h со шляпой" и встречается редко, разве что в слове
"химия" (^himio). Ну так для этого звука еще во времена Екатерины-II собирались
ввести отдельную букву (типа Г, но с перечеркнутой ножкой), однако так и не
собрались. Но если бы она была - включать её в этот самый минимально
необходимый набор не следовало-бы.
Как правило большинство из этих дополнительных букв - буквы того же самого
алфавита, но либо с диакритическими знаками (как И-Й или Е-Ё), либо с
дополнительными элементами (как Ш-Щ). Все эти дополнительные буквы разных
языков сопоставить между собой по принципу фонетического (а отнюдь не
"типографского") соответствия. Сопоставившиеся доп-символы разных языков
считать одним и тем-же не взирая на то как они изображаются. (Некоторые
послабления можно сделать для оригинальных символов, не являющихся вариантами
букв основного набора.) Получившийся в результате объединённый алфавит должен
помещаться в 60..62 символа. Если нет - алфавитную группу языков придётся
делить. Однако, по предварительным прикидкам это не понадобится даже для
латинского алфавита, т.к. всё разнообразие символов (заставившее комиссию ANSI
выделить для языков, использующих латинский алфавит, аж десять (!) различных
кодировок из шестнадцати) вызвано вовсе не разнообразием обозначаемых ими
звуков, а различием национальных традиций их написания. (Если же используемое в
некотором языке количество дополнительных символов сопоставимо с количеством
основных, то это просто означает, что данный алфавит для этого языка не
подходит.)
В результате все необходимые символы письменностей, использующих все
значимые алфавиты (плюс псевдографика, математические значки и.т.п.) должны
уложиться в 40..50 страниц, среди которых должна быть страница номер один - с
пробелом, цифрами, знаками препинания и прочими полезными значками. В неё же
можно поместить некоторое (очень ограниченное) количество (эквивалентных
пробелу) "слепых" символов, для обозначения конца строки, конца страницы, а
так же конца поля (табуляция). Храниться и передаваться такие коды могут либо
равномерным 12-и битным кодом, либо восьмибитными байтами с использованием
механизма переключения регистров. (01xxxxxx - первая (фиксированная) страница,
10xxxxxx и 11xxxxxx - две переключаемые страницы. 00yyyyyy - команда включить
регистр (пару страниц) номер yyyyyy), либо 16-и разрядными словами. В
последнем случае ненулевое значение старших четырёх бит пусть обозначает символы
иероглифических письменностей. (Тоже не все подряд, а только по-настоящему
необходимые.)