| Предыдущая глава |
↓ Содержание ↓
↑ Свернуть ↑
| Следующая глава |
буквами такой простой фокус к сожалению не получается. Очень уж от кодировки
зависит...
Но таки в файловых системах вариант регулярных выражений — крайне
упрощенный (можно даже сказать "выхолощенный"). Это как если бы в выражении
арифметическом почему-то нельзя было использовать скобки. И функции. Но ведь
можно же! А здесь у нас этих скобок — аж два вида: <...> и [...]
Кстати, напоминаю: регулярное выражение потому и "шаблон", что
"сопоставляется" с фрагментом строки, определяет — подходит он под него или
нет. Ну так конструкция <...> сопоставляется когда сопоставились все её
элементы, а конструкция [...] — когда один, любой. (Следующие после него даже
и не рассматриваются). А элементом может быть любая конструкция, в том числе и
вот такая. В результате чего они могут вкладываться друг в дружку как матрешки
на любую глубину. Как впрочем и подвыражения в арифметических выражениях...
Повторюсь: главная фенька шаблонов — префиксы повторения! Здесь * и ? не
сами заменяют какое получится количество символов, а только предписывают
сделать это следующему после них элементу. Так что вместо просто звёздочки
придётся написать *. а *А соответственно сопоставится с любым количеством
букв А идущих подряд — от того места, до куда дошло сопоставление.
Но количество повторений может быть и ограничено: {N} или {N,M} — ровно N,
или >= N но <= M где N и M — фокаловские выражения. Если отсутствуют то для
первого — "от 0", а для второго — "до бесконечности". Так что * это {,} а
? это {,1}. Есть еще + (плюс) эквивалентный {1,} и — (минус) предписывающий
данному префиксу не "жадный", а "ленивый" алгоритм сопоставления. Их смысл
ясен из названия и проявляется, когда элементов с префиксами повторения в
шаблоне несколько...
Впрочем, хватит и одного. Например в тексте _____аББаБа___ ленивый *-[Ба]Б
выделит только аБ в то время, как жадный *[Ба]Б всё аББаБ целиком.
Среди вышеупомянутых встроенных шаблонов есть так же %Д %В %И %К %У
изображающие заглавные русские буквы в других кодировках и %д %в %и %к %у
изображающие строчные (дД — в ДОС`овской, она же CP-866, вВ — в виндовой, она
же CP-1251, иИ — ИСО-8859.5, кК — КОИ-8 а так же уУ — пресловутый уникод.)
На предмет преобразования символов между кодировками: типа в анализирующем
шаблоне указана одна, а в парном к нему генерирующем — другая. Только русские,
потому, что латинские там везде как в ASCII. (Который содран с давнего
стандарта ISO. А его похоже спёрли у фашистов: климат — великая вещь! Казалось
бы — что такого, подумаешь... А ничего, что в европах даже при ручной обработке
почвы один земледелец кроме себя мог прокормить еще одного горожанина, а у нас
для этого надо было десять крестьян? И результаты труда вот этих лишних
работников накапливаются из года в год, из века в век... Или же с приятностью
проедаются... Немцы смогли это грамотно использовать, приняв во всех своих
землях еще аж в конце XVIII века, когда и Германии-то еще небыло, законы об
обязательном всеобщем школьном образовании. Над которыми долго потешались все
остальные европеи. Но лет через сто — к концу XIX века это уже была "страна
хорошистов и отличников" — по очень многим пунктам "впереди планеты всей".
Вплоть до того, что две науки: мировая (читай англо-саксонская) — отсталая,
и немецкая — передовая. А Первую Мировую немцы проиграли (уже практически
выигрывая "по очкам") чисто в результате предательства собственной элиты:
договорняка вишь им захотелось... Возвращаясь к нашей теме: еще до Второй
Мировой у них уже была телетайпетная сеть с автоматической коммутацией,
сопоставимая по эффективности с нынешним интернетом. Вот нулевая страница
ASCII и заполнена в основом командами управления этой сетью. Ну и телетайпом
немножко...) Так что шаблона %L для них всех вполне достаточно. Вот если и
когда будет какая либо экзотика, типа собственной ("нативной"?) американской
кодировки с неприличным названием ЕБЗДИК или её вариант с русскими буквами
ДКОИ, активно использовавшийся в серии ЕС-ЭВМ, сдуру содранной с идиотской
IBM-360, что, помнится, еще Дейкстра назвал величайшей победой запада в
холодной войне!...
Разумеется, в самом форматном выражении преобразования символов между
кодировками обозначаются теми же самыми буквами. (И тоже только русскими.)
При чем заглавная буква указывает преобразование "на экспорт" — из текущей
кодировки в указанную, а строчная — из указанной в текущую. (Которая — всегда
ДОС`овская.) Преобразуется тот фрагмент строки, что под маркером. Но префиксы
на это тоже действуют.
Из других "встроенных форматов" (кроме перекодировок) пока только R r
(реверс) и О о (отождествление). Реверс — перестановка в обратном порядке
байтов (для заглавной буквы) и битов в байтах (для строчной). О-большая это
отождествление русских и латинских букв для одной следующей после неё операции
поиска, а о-маленькая — заглавных и строчных.
Нашлась так же возможность разрешить синтаксическое недразоумение. Имеющее
место при необходимости преобразовать символы из кодировки X в кодировку Y
напрямую. (А не сначала в текущую, а потом из неё, что чревато потерей
некоторых символов, которые есть и в X и в Y, но в текущей — отсутствуют.)
И заключающееся в том что для этого надо две буквы, в то время как "встроенный
формат" Х в операторе Write %Х это вообще-то одна...
А чтобы две: Write %_%Хy здесь %Х в отличии от просто Х, это типа
обращение к подпрограмме. Оказывается, у нас еще и подпрограммы есть! Типа %N
или даже %{NNN}, где N — одна цифра — номер регистра, а NNN — выражение,
значение которого — номер программной строки. И этой подпрограмме видите-ли
тоже аргумент причитается! Ровно один. Вот вторая буковка в %Хy и служит таким
аргументом. Но впринципе это может быть что угодно, включая текстовые
константы "..." или составные операции (...). Оно не вычисляется а именно что
передаётся. И там в подпрограмме оно может быть как вычислено %% так и
использовано как текст #%. (Аргумент только один потому, что будь их несколько,
это бы потянуло за собой такие проблемы!... Прежде всего синтаксические.) При
передаче "..." или (...) теряет ограничивающие его скобки или кавычки.
В шаблоне, где %Х — "встроенный шаблон" %N — тоже аналог обращения к
подпрограмме. Но уже без параметров — проблемы синтаксиса: оно бы должно
выглядеть примерно так же как и в форматном выражении, но здесь для всех других
символов главный баламут всея Фокала % работает как "экранирующий".
Я было написал, что мол выше имеет место некоторая путанница с заглавными
и строчными буквами... Но нет: и Write %_%XY; и Write %_%Xy; и Write %_%xY;...
это всегда X -> Y. А вот если: Write %xY; то это две операции: сначала
X -> ДОС а потом ДОС -> Y. По другому — действительно устроить путаницу...
(Не забываем, что X Y здесь — условности: обе буквы, обозначающие
кодировки, обязательно русские.)
Однако, проблема преобразования символов разрешением вышеописанного
синтаксического недоразумения вовсе не исчерпывается. И включает не только
преобразование между кодировками (желательно без потери символов), или,
например, попутное превращение строчных букв в заглавные, или латинских в
эквивалентные им русские — что частный случай, но и общий, а это может
оказаться всё что угодно, что вообще придёт в голову...
С частным случаем впринципе должна справиться пара из анализирующего и
генерирующего шаблонов. (Для того и придуманы.) Но это "вид снаружи", а вот
внутри-то как? Неужто сооружать матрицу преобразований из каждой %X в каждую
%Y по полному графу?! (А при добавлении новой?... Слишком громоздко получается!)
Можно конешно выбрать промежуточную (или "базовую") %Z и тогда для каждой %X
будет нужна только пара: %X -> %Z и %Z -> %X. А все преобразования для общего
случая делать вот с этим вот %Z.
Частный случай реализуется без проблем, если в качестве базовой кодировки
взять достаточно мощную, например уникод, что все обычно и делают. А вот для
преобразований он решительно не годится! Хранить в таком виде тексты — еще
куда ни шло, но вот обрабатывать... Да и главный фокаловский принцип разумной
(и даже минимальной) достаточности там безобразно нарушается! Мало того что
оный уникод гиперизбыточен, ну так при этом еще и недостаточен: под сотню
разных фасонов стрелочек, звёздочек и прочей чепухи; безсистемно насована куча
букв А-латинская с дополнительными элементами; штабеля каких-то непонятных
закорючек. Ну и конешно же не просто редкие, а особо редкие китайские
иероглифы, известные дай бог паре десятков человек... Но за то нету того, что
было в древней семибитной (!) кодировке УПК и заменить это — нечем! А то что
этого теперь нет нигде и вот как-то обходимся... Ну так кодировка, поставившая
себе целью включать в себя ВСЁ (и зарезервировавшая под это столько позиций,
что до сих пор удалось заполнить едва десятую часть) обязана в первую очередь
включить в себя ВСЁ, что было в предшествующих ей кодировках, и уж только
потом... Не пожелала — под нож её! (А не нарушай собственных принципов!) Но
это-то таки еще можно бы простить, а вот безсистемность — нет. Вот те самые
рассованные по разным углам буквы A-латинские со всякими дополнительными
штрихами и черточками, U и E с разного вида точками, но почему-то не такими же,
как у A или I...
Но таки люди (при чем далеко не худшие люди!) проделали большую работу,
пронумеровав (почти) все возможные символы... А результат их труда нам годится
только как справочник — какие вообще символы бывают. И в конечном итоге
отправится на свалку. При чем сразу по причинам нескольких уровней. Верхний из
которых: она создана с позиций евроцентризма, несёт в себе гнилую идеологию
отказа от разума, работает на глобализацию по-американски. Что, впрочем, вполне
соответствовало духу времени. Однако, времена УЖЕ меняются — всё это ДОЛЖНО
уйти в прошлое. Потому что если не справимся, если не сможем всё это туда
"уйти", тогда хана человечеству: вымрет в течении примерно трёх-четырёх-пяти
поколений! (Всё перечисленное — симптомы: человечество смертельно больно, но
лечить его кроме нас больше некому...) Вот — дожили до "интересных" времён из
китайского ругательства, они же — "точка бифуркации". После которой либо
глобализация по-русски (через промежуточное состояние "мир панрегионов"
обещанное нам Школьниковым), либо отсутствие на Земле человека дважды разумного.
А точка бифуркации интересна как раз тем, что "цивилизационная траектория"
вдруг начинает зависеть в том числе и от совершенно ранее незначимых факторов...
Это когда буквально взмах крыла бабочки способен породить ураган. Или наоборот.
За сим, решая свои локальные задачи, удерживаем в виду и вот эти глобальные
цели и факторы... В том числе базовую (промежуточную) кодировку конструируем
свою собственную — не просто не оглядываясь на, но и...
Базовая (промежуточная) кодировка должна быть организована СИСТЕМАТИЧЕСКИ.
За образчик можно взять, например, нашу КОИ-8, сделанную как расширение ASCII.
Или скорее вот того давнего стандарта ИСО, где остаток страницы после
латинского алфавита оставался всё еще незаполненным. Там кодовое пространство
делится на страницы равного размера и эквивалентные друг дружке буквы стоят в
них на одних и тех же позициях. Поэтому преобразование их друг в дружку
осуществляется максимально просто: изменением номера страницы. В том числе
между заглавными и строчными — инверсией одного бита.
Там, кстати, (в полной версии КОИ-8) есть и псевдографика, и тоже
организованная куда более систематически чем в ДОС`овской кодировке, которой
приходится пользоваться. Приходится потому что деваться некуда: место под
ДОС`овскую псевдографику закреплено аппаратно без возможности его изменения.
Но нам всё это не на экран выводить... Так что псевдографику сделаем тоже
систематической, как в более приличных кодировках, нежели ДОС`овская.
И, кстати, проблема "забоя" (символа из всех единиц) у нас не стоит.
Но базовым таки должен быть русский алфавит, как более мощный, а отнюдь не
латинский. Который в минимальной комплектации (как у ИСО или в ASCII) никому
недостаточен. Кроме тех, для кого он совсем не годится. (Это не парадокс: они
пишут сделанными из его букв иероглифами, а алфавитная письменность обязана
быть фонетической!) Поэтому всяк, кому его навязали, пытался хоть как-то
приспособить вот это для своего языка... (А его именно что навязывали — как
один из компонентов гибридной войны, в том числе и на наших глазах и памяти.)
И поскольку каждый выёживался как мог, на свой лад — получилось "кто в лес,
кто по дрова". Так что "в максимальной комплектации" латиница — жуткий бардак!
Попытки хоть как-то это упорядочить, предпринимавшиеся например всё тем же
комитетом ИСО, так и не привели ни к чему путному. Так в ИСО-8859 из 16
кодировок 10 (!) — для латиницы. А индийскую "девангари" — (она у них под
номером 12) ИСО вообще не потянул. Думаю, что знаю почему: не смогли впихнуть
то, что пихали всем, в том числе и в ту, что якобы для нас: ИСО-8859.5
Прикинем: символ — 8-и-битный; 2^8 = 256, или 8 страниц по 32 символа.
Кодировок они сделали 16, это еще 4 бита. Надо ли так понимать, что задумана
была единая 12-и битная кодировка? Возможно, но вряд ли. Потому что в страницы
0-3 каждой из них, они всем впихнули одну и ту же "священную корову" ASCII; в
четвертую (тоже абсолютно для всех) — непонятно для кого предназначенный набор
дополнительных управляющих символов. Начинающийся с символа-заполнителя (с
кодом 80). При том, что в нулевой странице ASCII уже есть символ-заполнитель
с кодом 16. (Передаётся по "синхронной" линии связи в то время пока ничего
нет — чтобы не потерять синхронизацию и обозначить наличие несущей. Байт 16
это 00010110 — два импульса: единичной и двойной ширины, дополнительно
позволяющий определить младшим или старшим битом вперед передаётся информация.
А 80 это 10000000 — один импульс, разве что с краешку. А значит при
старт-стопном способе передачи старшим битом вперед сольётся со стартовым
импульсом, а вот байт 16 — нет.) То есть для каждой кодировки у них всего три
страницы. В первую из которых они неизвестно зачем еще впихнули всем (в том
числе и нам) два символа управления переносами: "неразрывный пробел" с кодом
A0, запрещающий перенос или другой разрыв строки, как будто соединённые им
| Предыдущая глава |
↓ Содержание ↓
↑ Свернуть ↑
| Следующая глава |