Hello All!
MIKSTURA: русско-латинский алфавит
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Я давно работаю над проблемой представления русского текста в среде,
в которой не все терминалы адекватно отображают русские буквы
Очевидное решение: использовать вместо русских букв латинские,
немедленно встречается со сложностью - разное количество букв
в алфавитах. В русском языке 33 буквы, а в англо-латинском алфавите
всего 26 знаков.
Приходится для одной русской буквы использовать пару латинских,
что приводит к увеличению объёма текста и затрудняет его восприятие.
Моя транслитерация Zamenhov приводит к выбуханию текста на 6%
Транскрипция Volapuk сокращает довесок до 4%, но при этом
обратное преобразование к русским буквам затруднено
Можно ли обойтись вообще без выбухания и без потери обратимости ?
Можно, если прибегнуть к военной хитрости: семь русских букв
мы оставляем без преобразования, для каждой из оставшихся 26-ти
подбираем по одной латинской букве
Текст получается компактным и неожиданно изящным. Если его
будут смотреть на терминале без русских букв, он сохранит читабельность.
Ведь неверно будут показаны только семь букв из 33-ёх,
причём эти буквы не принадлежат к числу частотных.
Ponimaete ideю ?
Для эксперимента под DOS-ом подходит знаменитый драйвер Д. Гуртяка KEYRUS
Я завёл третью альтернативную раскладку по образу и подобию русской ЦУКЕHГ
но с использованием латинских букв
Посмотрите внимательно сюда ...
Русский регистр
╔═══І═══І═══І═══І═══І═══І═══І═══І═══І═══І═══І═══І═══І═══І═══╗
║ ё │ ! │ " │ © │ ; │ , │ : │ ? │ * │ ( │ ) │ - │ = │ \ │ Bs║
╟───┴──┬┴──┬┴──┬┴──┬┴──┬┴──┬┴──┬┴──┬┴──┬┴──┬┴──┬┴──┬┴──┬┴───Є
║ TAB │ й │ ц │ у │ к │ е │ н │ г │ ш │ щ │ з │ х │ ъ │ ║
╟──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┘ ║
║ CAPS │ ф │ ы │ в │ а │ п │ р │ о │ л │ д │ ж │ э │ <──┘ ║
╟────────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴──────Є
║ Shift │ я │ ч │ с │ м │ и │ т │ ь │ б │ ю │ . │ Shift ║
╚══════════╧═══╧═══╧═══╧═══╧═══╧═══╧═══╧═══╧═══╧═══╧════════ў
Альтернативный регистр
╔═══І═══І═══І═══І═══І═══І═══І═══І═══І═══І═══І═══І═══І═══І═══╗
║ ё │ ! │ " │ . │ ; │ , │ : │ ? │ * │ ( │ ) │ ─ │ ═ │ \ │ Bs║
╟───┴──┬┴──┬┴──┬┴──┬┴──┬┴──┬┴──┬┴──┬┴──┬┴──┬┴──┬┴──┬┴──┬┴───Є
║ TAB │ j │ c │ u │ k │ e │ n │ g │ ш │ x │ z │ h │ q │ ║
╟──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┘ ║
║ CAPS │ f │ y │ v │ a │ p │ r │ o │ l │ d │ ж │ э │ <──┘ ║
╟────────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴──────Є
║ Shift │ я │ ч │ s │ m │ i │ t │ j │ b │ ю │ w │ Shift ║
╚══════════╧═══╧═══╧═══╧═══╧═══╧═══╧═══╧═══╧═══╧═══╧════════ў
Пояснение
~~~~~~~~~
Оставлены без преобразования гласные: я, ё, ю, э
и согласные: ш, ж, ч
Большинство русско-латинских пар подобрано по фонетическому соответствию
Особые случаи: ы - y, щ - x, ъ = q, ь - j
Русская 'ы' это русский вариант буквы 'и', мы его сопоставляем латинской 'y'
- греческому варианту буквы 'i'
Пара щ - x определяется по остаточному принципу, обе буквы нечастотные
Hепроизносимому твёрдому знаку мы сопоставим латинскую 'q', почувствуйте
твёрдость в начале слов: кварц, камень, кирпич, квадрат
Буквы 'й' и 'ь' заменяются на одну и ту же латинскую 'j',
однако потери обратимости кодировки при этом не происходит,
потому что мягкий знак ставится _только_ после согласных,
а 'й' в этой позиции _никогда_ не встречается
При таком раскладе английская буква 'w' остаётся без русской пары.
И поделом ей. Больно она толстая и некрасивая. А на клавиатуре ей место
_рядом_ с русской буквой 'ю' в альтернативном регистре на тот случай,
если придётся набрать что-то типа West
Преимущество MIKSTURA в том, что английские слова можно набирать _без_
переключения регистра
Самое время перейти к иллюстрациям ...
-= Вот русский текст =-
Hе то чтобы они изменили свои прежние взгляды, нет. Само пространство,
куда были направлены эти прежние взгляды (взгляд ведь всегда куда-то
направлен), стало сворачиваться и исчезать, пока от него не осталось
только микроскопическое пятнышко на ветровом стекле ума.
Вокруг замелькали совсем другие ландшафты.
-= Так он выглядит в транслитерации Zamenhof =-
Ne to chtoby oni izmenili svoi prezhnie vzgljady, net. Samo prostranstvo,
kuda byli napravleny ehti prezhnie vzgljady (vzgljad vedw vsegda kuda-to
napravlen), stalo svorachivatwsja i ischezatw, poka ot nego ne ostalosw
tolwko mikroskopicheskoe pjatnyshko na vetrovom stekle uma.
Vokrug zamelwkali sovsem drugie landshafty.
-= В транслитерации MIKSTURA размер кода меньше =-
Ne to чtoby oni izmenili svoi preжnie vzglяdy, net. Samo prostranstvo,
kuda byli napravleny эti preжnie vzglяdy (vzglяd vedj vsegda kuda-to
napravlen), stalo svoraчivatjsя i isчezatj, poka ot nego ne ostalosj
toljko mikroskopiчeskoe pяtnyшko na vetrovom stekle uma.
Vokrug zameljkali sovsem drugie landшafty.
-= При спрятанных русских буквах текст вполне читабелен =-
Ne to █toby oni izmenili svoi pre█nie vzgl█dy, net. Samo prostranstvo,
kuda byli napravleny █ti pre█nie vzgl█dy (vzgl█d vedj vsegda kuda-to
napravlen), stalo svora█ivatjs█ i is█ezatj, poka ot nego ne ostalosj
toljko mikroskopi█eskoe p█tny█ko na vetrovom stekle uma.
Vokrug zameljkali sovsem drugie land█afty.
Вместо русских букв можно использовать латинские с диакритиками:
к гласным сверху прилепим апостроф,
а к согласным снизу пририсуем запятую
┌───────────┬───┬───┬───┬───┐
│ Русские │ Я │ Ё │ Ю │ Э │
├───────────┼───┼───┼───┼───┤
│ │ , │ , │ , │ , │
│ Латинские │ A │ O │ U │ E │
└───────────┴───┴───┴───┴───┘
┌───────────┬───┬───┬───┐
│ Русские │ Ж │ Ш │ Ч │
├───────────┼───┼───┼───┤
│ Латинские │ Z │ S │ C │
│ │ ' │ ' │ ' │
└───────────┴───┴───┴───┘
Вот так, походя, мы решили проблему перевода русского языка
на латинскую письменность :)
Бред? А вы зайдите на страничку latinica.narod.ru
Там автор разрабатывает целую систему правописания на латинской основе,
меняет русскую орфографию
Я же предлагаю элементарную перекодировку.
Взгляните на исходники ...
/** mikstura.c ******************************************** 23.11.2003 **/
/*
Проверено на BC++ 3.1, модель памяти Small
Транслитерация MIKSTURA
Сохраняются семь русских букв,
остальные заменяются на латинские,
в основном, по фонетическому соответствию
*/
#include <stdio.h>
#include <string.h>
char *russian = "абвгдеёжзийклмнопрстуфхцчшщъыьэюя"
"АБВГДЕЁЖЗИЙКЛМHОПРСТУФХЦЧШЩЪЫЬЭЮЯ";
char *latin = "abvgdeёжzijklmnoprstufhcчшxqyjэюя"
"ABVGDEЁЖZIJKLMNOPRSTUFHCЧШXQYJЭЮЯ";
void main(void)
{
int c = 0; // символ на входе
char *p = 0; // указатель на символ в массиве
while ( (c = getchar()) != EOF ) { // считываем символ
p = strchr(russian, c);
if (p == NULL) // не русскую букву выводим без изменения
putchar(c);
else // собственно замена русской буквы латинской
putchar(latin[ (int) (p - russian) ]);
}
putchar('°');
}
/** end of mikstura.c ***************************************************/
/** unmikst.c ********************************************* 25.11.2003 **/
/*
Проверено на BC++ 3.1, модель памяти Small
Обратное преобразование к транслитерации MIKSTURA
*/
#include <stdio.h>
#include <string.h>
char *latin = "abvgdeёжzijklmnoprstufhcчшxqyэюя"
"ABVGDEЁЖZIJKLMNOPRSTUFHCЧШXQYЭЮЯ";
char *consonant = "bvgdжzklmnprstfhcчшxq"
"BVGDЖZKLMNPRSTFHCЧШXQ";
char *russian = "абвгдеёжзийклмнопрстуфхцчшщъыэюя"
"АБВГДЕЁЖЗИЙКЛМHОПРСТУФХЦЧШЩЪЫЭЮЯ";
void main(void)
{
int c = 0; // символ на входе
int ca = 0; // предшествующий
char *p = 0; // указатель на символ в массиве
while (1) {
ca = c;
if ( (c = getchar()) == EOF ) // считываем символ
break;
p = strchr(latin, c);
if (p == NULL) { // нелатинскую букву выводим без изменения
putchar(c);
continue;
}
if ( strchr("jJ", c) && strchr(consonant, ca) ) {
if (c == 'j') // 'J' после согласной заменяется на 'Ь'
putchar('ь'); // а в остальных случаях на 'Й'
else
putchar('Ь');
continue;
}
// замена латинской буквы русской
putchar(russian[ (int) (p - latin) ]);
}
putchar('°');
}
/** end of unmikst.c ****************************************************/
С уважением
Nick