Донецкий техникум промышленной автоматики

Чого не було в кодуваннях

І до чого досі так і не додумалися

Автор хотів би обговорити деякі недоліки поточної версії юнікод і поговорити з спільнотою про подальші шляхи його вдосконалення. Проблема, на наш погляд, полягає в тому, що unicode.org не систематизовані результати своєї роботи, в результаті чого не одна тільки комп'ютерна індустрія зазнала втрат. Якщо підсумувати, масштаби будуть дуже великі.


Власні назви і абревіатура - два нових керівників символу

У всіх програмах - пошукових серверах, базах даних, CAD-системах, текстових редакторах - необхідно шукати слова і порівнювати варіанти написання слова: усі літери рядкові, перша буква прописна, всі прописні букви. Крім того, користувач іноді пише в рядку пошуку з помилками або озаглавливает шуканий об'єкт з помилками - одна зайва літера, однієї літери не вистачає, одна буква змінена. Якщо в кодуванні прописну букву позначати малої з додатковим байтом попереду, то порівняння варіантів написання зводиться до пошуку з друкарською помилкою, а значить один алгоритм можна вже не реалізовувати. До того ж звільниться половина місць у таблиці кодування, можна розмістити більше символів (ISO вже застовпила стандарт 4-байтной кодування під назвою ISO 10646). Префіксним байтом можна маркувати імена власні і абревіатури на мовах без великих літер, що в подальшому допоможе пошуковим серверам. На мірою архівації тексту нововведення ніяк не позначається. В деталях воно виглядає наступним чином.

У тих випадках, коли зустрічається власна назва або початок пропозиції, поставити один префіксний байт перед словом (будемо умовно зображати його як У тих випадках, коли зустрічається власна назва або початок пропозиції, поставити один префіксний байт перед словом (будемо умовно зображати його як   ), Щоб вказати, що наступна за ним буква прописна (   anna -> Anna) ), Щоб вказати, що наступна за ним буква прописна ( anna -> Anna). Назвемо цей префіксний байт знаком "власна назва". Аналогічно для абревіатур, досить одного префіксного байта перед словом, щоб вказати, що всі букви до наступного пробілу прописні ( uno -> UNO). Назвемо цей байт знаком "абревіатура". Користувач і раніше ставить префікси сам, натискаючи клавіші "Shift" і "Caps Lock".

На погляд автора міжнародна організація надійшла дуже недалекоглядно, вибравши марнотратне кодування. І повторила поширена помилка, ототожнити позначення букв ( кодування ) І їх графічне зображення (шрифт). Це зовсім різні речі.


Індекси і межі: п'ять керуючих замість колишніх двох друкованих

Індекси міцно увійшли в наше життя: без них неможливо таке соціальне явище, як наука, - зрозуміло, без них немислима така всеохоплююча індустрія, як програмування. Вражає убогий, печерний спосіб запису індексів в текстових файлах - за допомогою квадратних дужок. Він змушує нас відтворювати математичні записи в своїй уяві. Піднімаючи питання на принципову висоту, те ж саме потрібно сказати про межах інтегрування і підсумовування. Ми могли б бачити індекси і межі "на своїх місцях" в звичайних текстових файлах, а не тільки в системах типу MathCAD, якби у нас була розумна кодування для них. Наприклад, така.

Нехай база - напис, для якої індекси і межі записуються, індекси і межі разом назвемо доважками, і нехай керуючі символи Нехай база - напис, для якої індекси і межі записуються, індекси і межі разом назвемо доважками, і нехай керуючі символи   ,   ,   ,   позначають, що з них починаються нижню межу, верхня межа, нижній індекс, верхній індекс , , , позначають, що з них починаються нижню межу, верхня межа, нижній індекс, верхній індекс. Між базою, керуючими символами і доважками немає ніяких прогалин і разом вони складають одне слово. У меж бувають індекси, у індексів - субіндекси. Будемо використовувати керуючі символи як вкладені відкривають дужки, а не випереджати доважок таким їх кількістю поспіль, на якому рівні вкладеності доважок знаходиться. Однак щоб повернутися на один рівень вкладеності тому, буде потрібно ще один керуючий символ "повернення" . Таким чином, слово a i j відображається як , Слово a i j - як , А числа можна записувати у вигляді -3.71 * 10 -14. На клавіатурі потрібні 5 нових клавіш, або їх роль повинні виконувати функціональні клавіші.


Корінь, дріб, інтеграли і дужки: десять друкованих символів перетворити в керуючі

Також убого виглядає неможливість записати в текстовому файлі загальновживані формули з коренем, дробом, інтегралами і фігурними дужками. Але ж всі ці символи в таблиці кодування є, але конформізм не дозволяє проінтерпретувати їх як керуючі. Неоднозначність тільки в тому, який символ - слеш або зворотний слеш - використовувати для позначення дробу. Символ слеш залишимо - раптом комусь захочеться созерщать приховану красу виразів 1/2 або 3/4 - і звернемося замість нього до символу зворотний слеш. Таким чином, вираз (a + b + c) / (d + e) ​​має відображатися як Також убого виглядає неможливість записати в текстовому файлі загальновживані формули з коренем, дробом, інтегралами і фігурними дужками , А вираз (a + b) (C + d) - як . Такі конструкції легко малюють все математичні програми і віртуозно пізнають, на яке з доданків користувач пересунув курсор стрілками на клавіатурі або мишею. Ще простіше поведінку трьох пар дужок і двох інтегралів (простого і кругового ) - відкривають дужки і інтеграли дорівнюють по висоті наступного за ними висловом, що закривають дужки - попереднього.


Два види діакритичних знаків

Існує два принципово різних види діакритичних знаків. Перші - будемо називати їх діакритичними некомпактамі - входять до складу букви і є її невід'ємною частиною, прикладами чого є всі букви латинського, кириличного, а також приголосні арабського алфавітів. Другі - будемо називати їх діакритичними буквами - позначають окрему букву, прикладами чого є всі голосні індо-арійських, дравідійських, арабського, єврейського алфавітів. У цих мови не горизонтальне і не вертикальний напрямок письма, а чергується (наступна буква може бути як над або під попередньої, так і після), і тільки фільтр в голові не дозволяє це побачити.

Кодування двох букв - звичайної і діакритичний - в будь-якому випадку зажадає двох байт. Якщо кодувати звичайні і діакритичні букви окремо і відображати останні не в наступному знакі-місці, а в попередньому шляхом операції "or" з ним, то редагування однієї літери складу не потребують заміни коду іншої літери, тобто не зажадає заміни коду всього складу тим же цілком. Операція "or" виконується з одним і знакоместу для всіх поспіль діакритичних букв (див. Примітку для індо-арійських алфавітів на computer20.euro.ru/ru/ar.htm ).

Звісно ж, що міжнародна організація unicode.org надійшла недбайливо, навіть не спробувавши звести багатовимірну задачу до одновимірної.


Розташування алфавітів

В Індії існує безліч споріднених індо-арійських мов. У них дуже різні алфавіти. Можна було б звичайні і діакритичні букви (або складу) різних мов, що позначають один і той же звук, кодувати однаково ( computer20.euro.ru/ru/i.htm ), А для додання накреслення, відповідного тій чи іншій мові, додавати перед текстом два байта - керуючий символ і номер мови. Тоді житель Індії, який не знає алфавіту свого сусіда, міг би прочитати повідомлення на своєму алфавіті (звучало б воно, напевно, так само, як для російського, читає на білоруському або російською), що не перекодіруя весь текст, а тільки змінивши один байт - номер мови. Одного байта на ідентифікатор мови вистачить - на планеті використовується тільки 67 алфавітів.

Аналогічно, в Індії існує безліч родинних дравидийских народів. І у них теж сильно відрізняються алфавіти. І їх тексти також можна було б перекодувати, змінюючи тільки один байт. А щоб не збільшувати кількість ідентифікаторів мови, коди букв дравідійської алфавіту могли б продовжувати коди букв індо-арійського. Для зручності запам'ятовування ідентифікаторів, нехай вони позначають алфавіти за годинниковою стрілкою в порядку проходження по колу на географічній карті ( computer20.euro.ru/ru/m.htm ): Малаялам - каннара - телугу - тамільська, деванагарі - гуджаратським - гурмукхи - ассамська - бенгальський - орія - сингальська.

Номер мови міг би нести додаткову функцію. Для індо-арійських, дравідійських і єврейського алфавітів - включати механізм відображення діакритичних букв (див. Під-заголовок в цій статті "Два види діакритичних знаків"). Для арабського ( computer20.euro.ru/ru/a.htm ) - переводити курсор на новий рядок, включати відображення букв справа наліво (слова не потрібно було б вирівнювати по правому краю в мові розмітки тексту або в пропрієтарним форматі файлу), вибір потрібного варіанта накреслення букви в залежності від положення (на початку слова, в середині, в кінці, в ізольованому стані), а також специфічне НЕ-європейське зображення цифр і трьох знаків пунктуації (кома, крапка з коми, знак питання). Для корейського - включати алгоритм упаковки букв в ієрогліфи за годинниковою стрілкою. Ну і в зв'язку з нашою пропозицією вище про кодування великих літер, номер мови міг би включати інтерпретацію керуючих символів "власна назва" і "абревіатура" для латиницею, кирилиці, грецького і вірменського. Будемо називати далі все друковані символи, що припадають на один і той же ідентифікатор мови, сторінкою.

Дві сотні символів тієї сторінки, яка вибирається автоматично, якщо не вказана на початку тексту, бажано віддати під знаки, які обслуговують переписку найбільшої кількості людей на землі. А чи не кодувати деякі з таких мов (в т.ч. російська) двома байтами, як в UTF-8. Економія локальних накопичувачів інформації та міжнародного трафіку очевидна. В одну сторінку цілком влазять латиницею, кирилиця і грецький. Розташування цих букв і розглянемо.

Латиницю (103 букви якої можна побачити в Киеве або на computer20.euro.ru/ru/ul.htm ) І кирилицю (89 букв, також в Вікіпедія або на computer20.euro.ru/ru/uc.htm ) Внесемо в кодування цілком (а не багаторазово у вигляді своїх підмножин). Також, щоб уникнути дублювань, постараємося викинути з кирилиці символи, що повторюють символи латиницею, і розмістити залишилися посеред латиницею, не порушуючи порядок сортування. Приймемо компроміси. Перший, літери 'c' і 'l' (а також варіант першої з діакретіком) розташовані в латиницею на початку, а в кирилиці в кінці, викидання їх в одному дуже б порушило сортування в іншому, тому розташуємо букви двічі. Другий, чверть букв 'a' (три штуки) можна розташувати один раз, зберігаючи сортування тільки в одному з алфавітів - розташуємо один раз і збережемо в латинській, тому що всі три букви з діакретікамі: на неросійських мовах публічні бази даних знаходяться в зародковому стані, і до порядку букв в них ще ніхто не звик (а на випадок, якби така звичка вже виникла, ділянки розташування всіх букв 'a' в обох алфавітах однакові , і використання латинського порядку тільки для трьох з них не виявиться при пошуку слова на основі мінімальної кількості перестановок букв). Разом 177 букв, computer20.euro.ru/ru/u.htm . Букву "o 'видалимо з грецького, частина алфавіту до неї (14 букв) розмістимо перед латинсько-кириличним, а частина (9 букв) - після. Накреслення букви "сигма" нехай залежить від налаштувань ОС, замість того, щоб бути присутнім цієї букві в двох місцях алфавіту - як уже було сказано, не треба плутати кодування і шрифт, кодування повинна бути одна для всіх накреслень, що позначають одну і ту ж букву.

Ну і останнє. Математичні символи і спецсимволи розташуємо не на тій же сторінці, де алфавіт науки (грецький), а на окремій, тому що їх кількість буде весь час збільшуватися, і невідомо, які ж з них будуть в різні моменти часу найбільш вживаними.

На кожній сторінці і в одних і тих же місцях розташовані цифри, знаки пріпінанія, знаки арифметичних операцій, дужки, керуючі символи (щоб не перемикати сторінки тільки через цих символів при листуванні на одному алфавіті). Кожне з цих підмножин НЕ перемежовується з іншими, щоб можна було визначати приналежність символу до підмножини всього двома операціями порівняння (для верхньої і нижньої меж). Винятки становлять, з одного боку, знаки "власна назва" і "абревіатура", з іншого - "перевернуті" знак і знак питання знаки. Перші існують тільки на латинсько-кірілліко-грецької і вірменської сторінках; а перевернуті знаки, що зустрічаються тільки в іспанському і до того ж одночасно з нормальними, існують тільки на латинсько-кірілліко-грецької сторінці.

І будемо використовувати два символи-перемикача сторінки поспіль для переходу на двухбайтное кодування - для ієрогліфів і букв, що перемежовуються з ієрогліфами, тобто, крім хіраґани і катакани, в двухбайтное кодуванні закодовані ще раз корейський і латиницею (суміш останньої з ієрогліфами зустрічається у в'єтнамському). Зрозуміло, в двухбайтное кодуванні якийсь символ повинен перемикати назад в однобайтном.


Колір, нахил, підкреслення, розміру шрифту і жирність - ще три нових керівників символу

Давайте подивимося правді в очі - текст не обходиться без розмітки. То там потрібно жирністю виділити, то тут потрібно гіпер-посилання поставити. Однак жоден з численних мов розмітки або пропрієтарних форматів файлів неможливо згодувати відеокарти безпосередньо, що лягає зайвої головним болем і ОС, і на ПО, і не скрізь можна ці мови і пропрієтарні формати застосувати. Пропоную для кольору, нахилу, підкреслення, розміру шрифту і жирності як для дійсно використовуваних ввести позначення прямо в текстовому файлі. Давайте перестанемо чинити опір і приймемо необхідне (а не "все", як бояться деякі самозабутні критики). Пояснення вимагає хіба що зміна розміру шрифту посеред тексту. Є таке поняття - агресивний пейзаж. Це - довга актуальна послідовність, наприклад, однаково забарвлені вікна на однотонної стіні (ви помітили, будівельники прикрашають стіни як матрьошки?), Або низка гіперпосилань шрифтом одного розміру. Так-так, саме тому ви періодично зустрічаєте сайти (треба сказати, правильно оформлені), на яких купа посилань дана шрифтами різного розміру - щоб око мав опорні знаки всередині цієї ділянки тексту.

Перед виділяється фразою розмістимо керуючі символи "початок фракції" Перед виділяється фразою розмістимо керуючі символи початок фракції   і середина фракції   , А після неї - символ кінець фракції і "середина фракції" , А після неї - символ "кінець фракції" . Між першими двома керуючими символами знаходяться байт-провісник і (опціонально) фракційна запис. У байті-провісника використовуються шість біт, перші три з яких вказують, які поля присутні під фракційної записи (якщо все три біти рівні нулю, значить довжина фракційної записи дорівнює нулю, тобто її немає зовсім). А утримувати вона може цілочисельні колір, розмір шрифту і деякий ідентифікатор, яким метится даний фрагмент тексту (цей ідентифікатор виконує ту ж роль, що і якір HTML, і повідомляється відкритий програмному забезпеченню, коли користувач клацає на фразу). Останні три біта байта-провісника вказують, що фраза підкреслена, жирна або похила. Домовимося фрагмент тексту від символу "початок фракції" до символу "кінець фракції" називати фракцією і домовимося, що фракції не можуть бути вкладеними - для спрощення апаратури, що відображає текст.

Дмитро ТЮРІН, [email protected]

Ви помітили, будівельники прикрашають стіни як матрьошки?