| Предыдущая глава |
↓ Содержание ↓
↑ Свернуть ↑
| Следующая глава |
понадобиться. (Но никаких 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│ ╨ ╤ ╥ ╙ ╘ ╒ ╓ ╫ ╪ ┘ ┌ █ ▄ ▌ ▐ ▀ │
│ │ │ │
└────────────────────────────────────┘ └───────────────────────────────────┘
звёздочками здесь обозначены символы разрывающей строчные русские буквы
с которыми еще до конца не определились пополам)
а & — то что было в УПК и больше нигде
нет (диагональные соединители?)
Промежуточная кодировка И-64 впринципе планируется как двенадцатибитная:
ненулевое значение во втором байте — признак что это буквы (а не псевдографика
и прочие символы) а так же номер алфавита, которых пока всего два: 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 — то многобайтный:
количество дополнительных байтов указывается следующими двумя битами. Общий
размер получается от одного до шести байт, итого: 6, 12, 16, 22, 28 и 34 бита
полезной информации. Для дальнейшего расширения предполагается зарезервировать
"лишнюю" страницу двухбайтной последовательности (с ведущим байтом: 10111111
т.е. BF); проблема забоя решается за счет того, что ведущим байтом из всех
единиц — FF придётся пожертвовать.
Хотя если ограничиться трёхбайтными символами — 18 полезных битов (что
даже уникоду — за глаза: там из миллиона зарезервированных позиций заполнено
чуть более ста тысяч, а 2^18 это 256 тысяч) то можно и проще: если два старших
бита = 11, то байтов продолжения всегда два.
Кстати, это позволяет сделать комбинированный вариант с "переключением
регистров": шесть или двенадцать бит номера страницы многобайтного символа
запоминаются и для всех следующих байтов продолжения остаются те же самые,
а символы со старшими битами 00 их не меняют. А возможные расширения (например
переключение кодировок) — за счет "лишней" страницы с ведущим байтом BF.
(Это может быть номер кодировки, упакованной вот таким вот образом.)
Так пожалуй и сделаем. (Назвав это "К-3".) Хотя это конешно чисто на
перспективу, но таки должно получиться раза в полтора компактнее utf-8 — за
счет переключения регистров. Разумеется для нас а не для наглов — для них
будет как и для всех остальных: никаких преимуществ латинскому алфавиту
больше не полагается.
И наконец — то, что можно условно назвать K-3U, К-3R и К-3П различающиеся
между собою только умолчаниями, а от вышеописанного К-3 — самим фактом их
наличия. В K-3U по умолчанию упаковывается уникод, К-3П — промежуточная И-64
и наконец К-3R — переходная между ними "рациональная" кодировка...
Будем различать кодировку и её упаковку. Так 20-и битная кодировка
"уникод" упакована в восьмибитные байты пятью (!) разными способами: по четыре
байта на символ что известно как utf-32; по два байта на символ плюс для
символов за пределами "первой плоскости" (т.е. длиннее 16 бит) — "сурогатные
пары"; при чем то и другое — в двух варианта: старшим и младшим байтом вперёд;
и неравномерная utf-8 с одним ключевым битом, описанная выше. (А мы здесь в
Фокале еще, чисто из вредности, добавили к ним трёхбайтный вариант utf-24.)
Соответственно К-3 это способ упаковки РАЗНЫХ кодировок с двумя ключевыми
битами — вот как описано выше: комбинированный неравномерно-регистровый. (Да,
"регистровый" — это только для потока. Но ничто не мешает помещая текст в
память, добавить к каждому ведомому байту причитающиеся ему ведущие;
преобразовать в упаковку utf-8; или полностью распаковать, сделав по 2, 3 или
4 байта на символ.) Указать, какая именно кодировка вот так упакована, можно в
любой момент с помощью символа на "лишней" странице с ведущим байтом BF. (Хотя
я вот сейчас засомневался — правильно ли это? Может назначить "лишней" самую
первую страницу с ведущим байтом 80, или даже какую-то в середине... Подумаем.)
Но изначально, пока такое указание не поступило — действуют умолчания. Для
K-3U упаковывается уникод, вернее первые его 4 "плоскости", которых ему — за
глаза. Для К-3П соответственно наша промежуточная И-64, а вот для К-3R то, что
описано ниже:
— в качестве нулевой страницы — первые 64 символа ASCII
— следующие 64 (где латинские буквы и еще 11 полезных символов) — далеко не
под первым номером, но включена по-умолчанию. То есть пока не встретилось ни
одного не-ASCII-шного символа, от ASCII это ничем не отличается...
— остальные страницы — скроены из фрагментов уникода. Но под каждый алфавит
или силабарий — целое число 64-символьных страниц. Под алфавиты с заглавными и
строчными буквами — по две соседние. Так девангари — один в один. Другие пока
что малознакомые нам алфавиты — тоже. А русский — две страницы, где заглавные
с кода 410 — с начала первой страницы, а четвертушка с буквой Ё и
дополнительными символами для славянских языков, которая с кода 400 — после
них. Для строчных проще: с 430 по 45F.
— для латинского алфавита — никаких куч букв А с разными черточками.
(И никаких дополнительных страниц, где в уникоде весь этот мусор размещается!)
Все эти многочисленные символы с дополнительными элементами образуются из
основных с помощью ВШ (шаг назад) и одного из символов нулевой страницы. Так
например кружочек над буквой указывается звёздочкой, точка — точкой, а умляут
(двоеточие) — двоеточием. (А под сопутствующий мусор выделить специальную
мусорную страницу из резерва первых страниц, там же где и псевдографика.)
| Предыдущая глава |
↓ Содержание ↓
↑ Свернуть ↑
| Следующая глава |