| Предыдущая глава |
↓ Содержание ↓
↑ Свернуть ↑
| Следующая глава |
слова — одно слово. И еще "мягкий дефис" символ нулевой ширины (с кодом AD),
наоборот разрешающий перенос вот в этом месте и оказавшись последним в строке,
как раз и превращающийся в знак переноса. (И это при том, что у них же во
втором комплекте управляющих символов уже есть две команды с примерно таким же
смыслом.) Чтобы их впихнуть, русские буквы, без Ё как раз и занимающие всю
страницу целиком, сдвинули на пол страницы, нарушив принцип формирования этой
кодировки. Но таки в три страницы уложились. А вот с девангари такой фокус у
них не получился. Письменность это слоговая, а слогов — много. И хотя
заглавных и строчных букв там нет — в уникоде занимает четыре страницы, а не
три, как русский с дополнительными буквами для славянских языков. (Чтобы букве
Ё не так скушно было...)
В общем решено: все остальные алфавиты размещаем в порядке русского,
по-возможности по фонетическому принципу. Но страницы по 32 символа маловаты.
Следующий размер при двоичной системе счисления — 64. Этого должно хватить и
для силлабариев (аналогов алфавита для слоговой письменности). Например в
заново переоткрытой Чудиновым русской рунице, символов — штук пятьдесят.
(Правда очень любящих объединятся в лигатуры.) Но там для каждой согласной в
основном только два варианта — с "передним" и "задним" гласными (смягчающим
согласную и не смягчающим) — под тогдашнюю еще весьма нечеткую и грубую
артикуляцию. (А все слоги тогда, до нашествия эрбинов, были исключительно
открытые.) А вот в индийской девангари хотя и только 47: 33 согласных и 14
гласных, но "согласные" — это сами слоги (парами: обычный и придыхательный,
типа ГА-ГХА, КА-КХА...), а гласные — как одиночные, так и модификаторы к ним
(чтобы получилось ГО-ГХО, ГЕ-ГХЕ, ГИ-ГХИ...), так что возможно еще столько-же.
Это если по-минимуму, а то в уникоде — еще куча лигатур, типа — с разной
длительностью... Но уж коли мы таки взялись обозначать не картинки, как в
уникоде, а смысл — надо смотреть, как там с сочетаниями согласный-гласный:
если все слоги исключительно открытые, то отдельных модификаторов не
требуется, а вот если нет... Возможны варианты.
Итак, пространство распределяем 64-символьными страницами. (Пусть даже
пока что они будут редкозаполненными.) Сдвиг на пол страницы, как это учинил
ИСО по отношению к русскому алфавиту — не допускается. Но страница по мере
надобности может "складываться" на четыре четвертушки. (Вот как для "нулевой"
страницы, где все скобки должны быть друг под дружкою. Или для псевдографики,
которой тоже четыре вида.) Или пополам — вот как для алфавитов: под основные
символы и под дополнительные (у нас это только Ё), которыми, если что, можно
пожертвовать, преобразовав их в основные. Для чего Ё должна стоять в той же
позиции что и Е, а не где попало, как у ИСО. (Они её тупо впихнули первой
после своего любимого неразрывного пробела A0, и только потом стали подбирать
ей компанию...)
Итого, рассматриваемая промежуточная кодировка (условно назовём её П-12)
содержит по две страницы на алфавит (которых пока только два), страницу под
псевдографику и "нулевую" страницу. Она же "системная" — самая главная: должна
содержать минимально необходимый, но по-возможности функционально полный набор
средств для достижения тех же целей, что преследовались и при построении
кодировки ASCII, но с другими приоритетами. Для ASCII главное было ручное
управление сетью и оконечным оборудованием. Поскольку вычислительной техники
для этого тогда просто небыло. Далее — представление текстов, включее их
форматирование — разбиение на слова, строчки и абзацы (параграфы). Для чего и
тогда и до сих пор используются некоторые из команд управления оконечным
оборудованием. Всё остальное — по остаточному принципу: спасибо что хоть буквы
в алфавитном порядке... И цифры. Все прочие символы набросаны как попало...
Для П-12 приоритеты обратные. Своим алфавитным порядком, как это сделали в
КОИ-8, больше не жертвуем. Управление сетью и оборудованием возлагаем на
драйверы... Так: считаем, что в дошедшем до нас потоке символов экранирующие
символы (АР1), если они там были — уже изъяты (или при передаче будут
автоматически вставлены) и нам без надобности. Так же как и команда "начало
пакета" с кодом 01. (Для файла — это его физическое начало.) А вот конец
пакета (Ctrl/D обозначающий в UNIX`е конец файла) и конец тела пакета (Ctrl/Ц),
а так же его начало — конец заголовка (Ctrl/Б), нам очень даже могут
понадобиться. (Но никаких Ctrl/Z как в ДОС`е, ибо это глупость и нарушение
протокола! Конец текстового файла приходилось обозначать в те (достаточно
древние) времена, вернее в тех файловых системах (ФС) где размер файла только с
точностью до блока. В ФС писишного ДОС`а он изначально — с точностью до байта.
А что Z последняя буква (ихнего) алфавита, еще и рассчитано на тупорылого
обывателя, так же как индексы массивов не с нуля, а с единицы в Бейске...)
Сохраним так же три абстрактные команды (тоже из четырёх) оказавшиеся под
вышеописанными пакетообразующими символами. (Забегая вперёд: возможно
понадобятся для "переключения регистров".)
Далее. Именно в нулевую страницу переместим все полезные значки ASCII, не
являющиеся буквами. (Их там два раза по шесть штук.) И расположены они тут
должны быть систематически. В частности скобки, которых четыре вида — друг под
дружкой. И кавычки, которых три. (Сохранять порядок символов что и в ASCII при
этом совершенно без надобности.) Под них выделим по два символа в начале двух
первых четвертушек и по четыре в конце. Впрочем код 00 остаётся на своём месте:
"забой" не перезжает.
Остальные команды нулевой страницы ASCII сохраняются. В том числе "вопрос"
КТМ ("кто там") и два варианта ответа на него ДА и НЕТ. Правда малополезные ВК
и ПФ переезжают на другие места (вместо еще более бесполезных КН и ЗМ). И под
вопросом пока остаются два символа: уже упоминавшийся СИН с кодом 16 (который
символ-заполнитель — для синхронизации) и АН (анулировать) находящийся точно
под ВШ (шаг назад). Символ-заполнитель вроде как в ведении драйвера, а нам
нужен управляющий код для образования лигатур. (Это если учесть что постановка
диакритических знаков — с помощью ВШ он же b и символов нулевой страницы.
(Условности! Это в оные времена пишущая машинка реально делала шаг назад и
печатала второй символ поверх первого...) В общем получается нечто типа:
0 1 2 3 4 5 6 7 8 9 A B C D E F пр — пробел
┌────────────────────────────────────────────────┐ a == ЗВ ?? == КТМ
0│00 @ /b /c /d ?? ДА a b t n v { | } ^ │ b == ВШ не == НЕТ
1│~ ` к1 к2 к3 не ** p ** f r E [ ] ! │ n == ПС r == ВК
2│пр ' * # $ % & . , ; : + ( — ) / │ p == КБ конец абзаца
3│_ " 0 1 2 3 4 5 6 7 8 9 < = > ? │ t == ГТ v == ВТ
└────────────────────────────────────────────────┘ f == ПФ прогон формата
p == КБ конец абзаца
(текстового блока)
для сравнения — то же самое место в ASCII:
си == СИН (заполнитель)
0 1 2 3 4 5 6 7 8 9 A B C D E F АН — анулировать
┌───────────────────────────────────────────────┐ КН — кончилась бумага
0│00 /а /b /c /d ?? ДА a b t n v f r рс лт│ ЗМ — заменить (цвет шрифт)
1│эк к0 к1 к2 к3 не си p АН КН ЗМ E РФ РГ РЗ РЭ│ эк == АР1 (экранирующий)
2│пр ! " # $ % & ' ( ) * + , — . / │ E == АР2 (ESC)
3│0 1 2 3 4 5 6 7 8 9 : ; < = > ? │ рс лт == РУС ЛАТ
└───────────────────────────────────────────────┘ РФ РГ РЗ РЭ — разделители
файлов, групп, записей, элементов (для БД)
Псевдографика: (по сравнению с ДОС`овской
0 1 2 3 4 5 6 7 8 9 A B C D E F 0 1 2 3 4 5 6 7 8 9 A B C D E F
┌────────────────────────────────────┐ ┌───────────────────────────────────┐
│ │ │ │
0│ ─ │ ┌ ┬ ┐ ├ ┼ ┤ └ ┴ ┘ & <— * ▀ ░ │ A│ а б в г д е ж з и й к л м н о п │
│ │ │ │
1│ ■ * ╒ ╤ ╕ ╞ ╪ ╡ ╘ ╧ ╛ & * ▄ ▒ │ B│ ░ ▒ ▓ │ ┤ ╡ ╢ ╖ ╕ ╣ ║ ╗ ╝ ╜ ╛ ┐ │
│ │ │ │
2│ ∙ * ╓ ╥ ╖ ╟ ╫ ╢ ╙ ╨ ╜ & -> * ▌ ▓ │ C│ └ ┴ ┬ ├ ─ ┼ ╞ ╟ ╚ ╔ ╩ ╦ ╠ ═ ╬ ╧ │
│ │ │ │
3│ ═ ║ ╔ ╦ ╗ ╠ ╬ ╣ ╚ ╩ ╝ & * ▐ █ │ D│ ╨ ╤ ╥ ╙ ╘ ╒ ╓ ╫ ╪ ┘ ┌ █ ▄ ▌ ▐ ▀ │
│ │ │ │
└────────────────────────────────────┘ └───────────────────────────────────┘
звёздочками здесь обозначены символы разрывающей строчные русские буквы
с которыми еще до конца не определились пополам)
а & — то что было в УПК и больше нигде
нет (диагональные соединители?)
Промежуточная кодировка П-12 сразу планируется как двенадцатибитная:
ненулевое значение во втором байте — признак что это буквы (а не псевдографика
и прочие символы) а так же номер алфавита, которых пока всего два: 4хх русский
и 5хх — латинский. И хотя пока не планируется извлекать её из недр Фокала на
свет божий даже за пределы оперирующего с целочисленными кодами символов
механизма %r (см. далее), однако ничего и не мешает этому...
((Лирическое отступление: немножко про кодировки и их "упаковку" в.
Переход на размер машинного слова, кратного не восьми, а двенадцати битам,
позволил бы решить массу проблем (см. статью "12 лучше чем 8") и в том числе
обеспечил бы равномерной кодировкой все значимые алфавиты и силабарии. (Но для
иероглифических письменностей требуется другой принцип.) Сейчас же — при
восьмибитном байте, понадобится либо по два байта на символ (т.е 16 бит), либо
использование схемы с переключением регистров, как это было в эпоху
семибитного байта, либо неравномерное кодирование. Вернее упаковка или
расфасовка более длинного числа по восьмибитным байтам.
Собственно для переключения регистров и зарезервированы в нулевой странице
команды к1-к3. Схема переключения регистров полагается такая: восьмибитный байт
это четыре страницы по 64 символа. Нулевая всегда остаётся неизменной, а каждой
из оставшися трёх с помощью соответствующей ей команды назначается одна из
страниц кодировки. (Нулевая страница туда никогда не назначается и код 00 по
прежнему можно использовать для специальных целей.) Команда получается
двухбайтная, но это не 64 а 256 страниц. То есть кодировка получается 14-и
битная. Даже если зарезервировать первые 8 или 16 страниц для специальных
целей, "лишнего" пространства аж в 12 тысяч символов вполне хватит даже на
основные иероглифы. (Японцам, например, они нужны далеко не все.)
Неравномерное кодирование — ну хотя бы по принципу той же utf-8, где
ключевой — старший бит байта. Если он 0, то размер символа 1 байт и это две
первых страницы (у них это один-в-один ихнее ASCII, а вот у нас следующей
страницей после "нулевой" будет либо псевдографика, либо "системный" алфавит,
он же "курсив"); если он 1 то это многобайтная последовательность, состоящая
из "ведущего" или "стартового" байта и указанного им количества байт
продолжения. У них два старших бита = 10, а остальные это очередные шесть бит
полезной информации. (Как раз номер буковки на 64-х символьной странице.)
У стартового байта старшие биты это длина символа в "единичной" системе
счисления: 110 если 2, 1110 — 3, 11110 — 4... И тогда всего полезной
информации будет 7, 11, 16, 21, 26, 31 и 36 бит при 1-7 байтах на символ.
Хотя более чем четырёхбайтные последовательности вроде как не используются.
Можно сделать ключевыми два старших бита: если они 00 то оставшиеся шесть
бит — код символа на нулевой "системной" странице. Если старшие два бита = 10
то это двухбайтный символ — по шесть полезных бит на байт. У байта продолжения
два старших бита — 01. И наконец если два старших бита = 11 — то многобайтный:
количество дополнительных байтов указывается следующими двумя битами. Общий
| Предыдущая глава |
↓ Содержание ↓
↑ Свернуть ↑
| Следующая глава |