LINUX.ORG.RU

яролит - реализация на javascript

 , транслитерация,


0

1

Думаю, кто-то помнит тему Новая версия Яролита (форк ГОСТ 16876-71, табл 2)

На страничке http://программирование-по-русски.рф/яролит.яргт/ можно попробовать ещё более новую версию реализации яролита. Наконец-то я сделал обратное, а не только прямое преобразование.

Кодировка на данный момент такова:

Русский алфавит:

a b v g d e jo zh z i jj k l m n o p r s t u f kh c ch sh shh jq y q eh ju ja

(Соответствует ГОСТ 16876-71, таблица 2, кроме Ь = Q и Ъ = JQ - в госте эти значки превращаются в небуквенные литеры)

Английские буквы:

xe - переключение в английский режим. В частности, «xeRussia» раскодируется как «Russia», а не как «Руссиа».

В английском режиме «x» кодируется как «xx», а «w» - как «ww»

xr - переключение обратно на русский

Суммарно, JAxeRxrJA == ЯRЯ

Не ASCII, не кириллица = xuNNNNNNx, где NNNNNN - 16-ричный код символа.

Исходники функций прямого и обратного преобразования - https://bitbucket.org/budden/ppr/src/master/static/jarolit/

Буду благодарен за код ревью. Пока речь не идёт об упаковке в тот или иной «пакет». Наиболее интересно на данный момент, как сделать код более быстрым. Например, имеет ли смысл делать case по коду символа, а не по строковым значениями? С точки зрения правильности код выглядит правильным, но если увидите баги - пишите.

★★★★★

Последнее исправление: den73 (всего исправлений: 1)

Ответ на: комментарий от den73

Или ты хочешь сказать, что я должен utf преобразовать в UCS и тем самым избавиться от влияния кодовой страницы?

Ага. Без UCS (то есть UTF32) ты никак не сможешь сравнивать числа. Или, как вариант, можешь навелосипедить (или вызвать для этого iconv -c) перекодировку всего в cp1251 и работать с однобайтовыми символами (но тогда потеряются все нерусские и нелатинские символы в тексте)

monk ★★★★★
()

den73

У меня стойкое чувство что авторы сайта программирование-по-русски.рф

тролли - а ты, глупенький, повелся

abs ★★★
()
Ответ на: комментарий от anonymous

Ty hotel skazat` UTF-8.

В смысле, сделать массив int64 (чтобы 6 байт влазило)? Тоже можно. Разве что в два раза менее эффективно.

monk ★★★★★
()
Ответ на: комментарий от abs

Ты походу автор этого сайта, и тролишь сам себя?

С разморозкой, лол.

theNamelessOne ★★★★★
()
Ответ на: комментарий от abs

Всё ещё хуже. Он не троллит.

Вообще, если серьезно: транслит вещь нужная. Иногда. В тех же томографах, которые приводились в примере выше. Но, алё, 2019 год! Реальная потребность во всём этом очень резко снизилась.

И если бы разработка велась, скажем так, другими людьми, то есть без всего этого «программирования по-русски» и с описанием конкретных решаемых проблем и целей (например: в больницах требуется вписыванием имён пациентов, из-за этого путаница, мы хотим её решить): я бы не троллил и вообще относился бы к автору с уважением.

Сейчас же всё это напрминает какой-то бред. Как если бы человек истово ненавидел современный запад (демократию развели, Россию-матушку притесняют!!11, п****ры по цлицам парады устраивают!1) и пытается войну с собственными комплексами подать под видом полезной деятельности.

Кто-то выше привёл цитату, видимо с сайта автора:

Язык - важная составная часть национальной идентичности. Русский язык несколько столетий боролся за главенство в России и достиг его только в советское время. Но сейчас русский уступает место английскому. Это уже произошло в науке и технологии, это происходит в образовании. Если ничего не делать, то скоро элита общества станет двуязычной или даже англоязычной.

Всё так. Но побеждают (эти победы всегда временны) те культуры, чьи ценности наиболее отвечают запросам людей в мире. Английский, вообще-то, стал мировым после Второй мировой войны. До этого был немецкий. Поэтому тут самое время вспомнить анекдот про бордель и двигание кроватей.

anonymous
()
Ответ на: комментарий от theNamelessOne

Зачем такие извращения? Что мешает работать напрямую с байтами в UTF-8?

Покажи, как. Вот у тебя есть char* со строкой в UTF-8. Покажи, как будешь делать switch (или аналогичный поиск) по кускам произвольной длины.

monk ★★★★★
()
Ответ на: комментарий от bread

Почему не взять для ь одинарный j если у тебя jj для й?

Транслятор усложняется. narjjan - это нарьян или нарйан?

monk ★★★★★
()
Ответ на: комментарий от bread

Почему не взять для ь одинарный j если у тебя jj для й?

j - это префиксная буква, jo, ja, ju. Если ей придать самостоятельный смысл, разрушится обратимость. q - это перевёрнутый мягкий знак, и совершенно случайно во взятом за основу ГОСТЕ q был никак не задействован. Хотя на самом-то деле я сначала придумал Яролит, а потом случайно оказалось, что он совпадает с ГОСТ.

den73 ★★★★★
() автор топика
Последнее исправление: den73 (всего исправлений: 1)
Ответ на: комментарий от monk

Не усложняется, а становится невозможно его сделать, т.к. фамилии и аббревиатуры могут быть более-менее произвольными.

den73 ★★★★★
() автор топика
Ответ на: комментарий от den73

й в аббревиатуре бывает крайне редко и ещё более редко может быть й перед гласной и не в начале слова. Фамилия всё-таки записываются по правилам произношения. Правила написать можно, но их будет много.

monk ★★★★★
()
Ответ на: комментарий от Lancelot

Полностью избавиться от switch нельзя, поскольку нужно выполнять разный код в зависимости от буквы. Если это делать через лямбды, то получается в 20 раз медленнее, согласно

https://jsperf.com/switch-vs-object-function

Значит, нужно часть оставить в виде switch, а дальше выделять диапазоны букв и там уже через массив. Я заменил вот такой код

              case 'A': Зб('А'); break; case 'a': Зб('а'); break;
              case 'B': Зб('Б'); break; case 'b': Зб('б'); break;
              case 'V': Зб('В'); break; case 'v': Зб('в'); break;
              case 'G': Зб('Г'); break; case 'g': Зб('г'); break;
              case 'D': Зб('Д'); break; case 'd': Зб('д'); break;
              case 'E': Зб('Е'); break; case 'e': Зб('е'); break;
              case 'Z': Зб('З'); break; case 'z': Зб('з'); break;
              case 'I': Зб('И'); break; case 'i': Зб('и'); break;
              case 'K': Зб('К'); break; case 'k': Зб('к'); break;
              case 'L': Зб('Л'); break; case 'l': Зб('л'); break;
              case 'M': Зб('М'); break; case 'm': Зб('м'); break;
              case 'N': Зб('Н'); break; case 'n': Зб('н'); break;
              case 'O': Зб('О'); break; case 'o': Зб('о'); break;
              case 'P': Зб('П'); break; case 'p': Зб('п'); break;
              case 'R': Зб('Р'); break; case 'r': Зб('р'); break;
              case 'S': Зб('С'); break; case 's': Зб('с'); break;
              case 'T': Зб('Т'); break; case 't': Зб('т'); break;
              case 'U': Зб('У'); break; case 'u': Зб('у'); break;
              case 'F': Зб('Ф'); break; case 'f': Зб('ф'); break;
              case 'C': Зб('Ц'); break; case 'c': Зб('ц'); break; 
              case 'Y': Зб('Ы'); break; case 'y': Зб('ы'); break;
              case 'Q': Зб('Ь'); break; case 'q': Зб('ь'); break;

, на такой вот код:

              default: 
                Код = б.charCodeAt(0);
                // a..z
                if (97 <= Код && Код <= 122) {
                 Зб(Таблица1[Код-97])
                } else if (65 <= Код && Код <= 90) {
                 Зб(Таблица2[Код-65])
                } else Зб(б);

Замер показал следующее: вариант со switch примерно вдвое медленнее для текста длиной порядка нескольких сотен букв. Для длинного текста основной фактор замедления - это длина текста и там switch уже не играет роли. Я думаю, замедление происходит в момент добавления буквы ко всё удлинняющейся строке. Область использования транслита - это, конечно, короткие куски текста. Поэтому длинные тексты я выкинул только что. Но замедление вдвое - надо ли ради него так сильно париться? Я ещё подумаю над этим.

den73 ★★★★★
() автор топика
Последнее исправление: den73 (всего исправлений: 2)
Ответ на: комментарий от monk

Если невозможно, приведи пример, который никак однозначно не определяется, если ь = j.

«первый деньапреля» == «первый деняпреля»

Ведь мы же не можем наложить требование на отсутствие опечаток. Или на стилизмы типа хеш-тегов, где слова принято слеплять.

den73 ★★★★★
() автор топика
Последнее исправление: den73 (всего исправлений: 1)
Ответ на: комментарий от den73

Потому что йотирование обычно смягчает предшествующие согласные, и мягкий знак тоже смягчает. Ну и о q сильнее спотыкаешься (субъективно).

bread
()
Ответ на: комментарий от den73

Можно было бы даже в русском языке подсократить число букв и писать: кльон кльуч кльауза. А в начале слов применять й: йаркий йуркий йож. Так и более однозначно в плане произношения выходит.

bread
()
Ответ на: комментарий от bread

Ну ок, с одной стороны неэстетичность, а с другой - необратимость. При том, что транслит уже неэстетичен, и речь по сути дела идёт о сортах говна.

den73 ★★★★★
() автор топика
Ответ на: комментарий от monk

й в аббревиатуре бывает крайне редко и ещё более редко может быть й перед гласной и не в начале слова

йог

франсис гойя

песнь о гайавате

омар хайям

den73 ★★★★★
() автор топика
Последнее исправление: den73 (всего исправлений: 2)

Тупые американцы. Даже букв нормальных не имеют. Пусть они делают перевод. Чо мы всегда под них подстравиемся. Пусть америкосы переводят с русского на свой ущербный язык.

anonymous
()
Ответ на: комментарий от den73

Здесь везде правило: «ь» не бывает после гласной и в начале слова.

Вот «деньапреля» действительно не разбирается, но это не слово русского языка (и не фамилия и не аббревиатура).

monk ★★★★★
()
Ответ на: комментарий от monk

Речь идёт о передаче текста. Ведь ASCII будет передавать английский язык независимо от того, правильный это текст, неправильный, или это какие-нибудь авангардистские эксперименты. А почему мы должны ограничивать транслит только тем, что укладывается в какие-то правила?

den73 ★★★★★
() автор топика
Ответ на: комментарий от monk

«ь» не бывает после гласной и в начале слова

Важно-то перед гласной, а не после, т.к. j - это префиксная буква. Пожалуйста:

пьем пьяница пьедестал пьеса бьеф лье Ришелье

И чтобы уж жизнь мёдом не казалась - ты забыл про твёрдый знак.

съем, съём

den73 ★★★★★
() автор топика
Ответ на: комментарий от den73

Ну в принципе да, вроде бы все гласные за ь сами в кодировке начинаются на j, так что вроде как для корректных слов не страшно.

А представь, что мы хотим затранслитить следующий текст:

«абвгдеёжзийклмнопрстуфхцчшщъыьэюя»

Неужто идея использовать q настолько отвратительна, что алфавит останется хромым?

den73 ★★★★★
() автор топика
Последнее исправление: den73 (всего исправлений: 1)
Ответ на: комментарий от den73

https://yandex.ru/video/search?text=эльуан&path=wizard&noreask=1

эльуан

Но это всё херь конечно, 11 тысяч видео - ни о чём.

устьице устьинский мост

http://schoolusturen.lbihost.ru

устьуренская

Поздравляю, ты таки сломал ю на существующем в России топониме и названии организации.

den73 ★★★★★
() автор топика
Последнее исправление: den73 (всего исправлений: 1)

Пиздец.

anonymous
()
Ответ на: комментарий от den73

пьем пьяница пьедестал пьеса бьеф лье Ришелье

А здесь «й» не бывает перед «э», «а», «о», «и», «у».

И чтобы уж жизнь мёдом не казалась - ты забыл про твёрдый знак.

Про него речь не шла :-)

monk ★★★★★
()
Ответ на: комментарий от den73

А представь, что мы хотим затранслитить следующий текст:

Да это понятно. Просто если задача «транслитить любые слова», то можно. Если «транслитить любую последовательность русских букв», то, естественно, преобразование становится необратимым.

monk ★★★★★
()
Ответ на: комментарий от monk

По-русски будет усть-уренская.

Если нам нужен транслит для документооборота, то «Устьуренская» является официальным названием из документа, и на нём твой транслит сломается.

Вот: https://госреестр.рф/GosReestr/Show/1042391

Что теперь является предметом обсуждения?

den73 ★★★★★
() автор топика
Последнее исправление: den73 (всего исправлений: 1)
Ответ на: комментарий от den73

Альакрам Гумматов как по-русски будет?

Аль-Акрам он будет. «Наищедрейший».

А слитно писать такая же безграмотность, как фамилию Жана Лерона Д'Аламбера писать как «Даламбер».

Ну а если «для документооборота», то есть «Ебугэ угэьэ». Школа так называется. Хотя после гласных мягкого знака не бывает.

monk ★★★★★
()
Ответ на: комментарий от Aber

а еще можно избавиться от латинских и греческих символов в математике, физике, химии, потом исключить из речи всякие автомобили, велосипеды, можно и от тюркизмов типа штанов, изюма и караваев, а потом избавимся от римских, греческих и еврейских имен… да и вообще будем деревянному члену поклоняться, вернемся к родной вере

tz4678 ★★
()
Ответ на: комментарий от tz4678

И от вавилонской шестидесятиричной системы времени и координат откажемся.

Aber ★★★★★
()
Ответ на: комментарий от den73

Ну и кстати, да, кодируя мягкий знак как j, ты разрушаешь не только документооборот, но и возможность использовать этот транслит для других языков, основанных на русской кириллице, в которых Ебугэ угэьэ. Т.е. вопрос ещё раз: какой тезис ты защищаешь? Что в транслите мягкий знак надо кодировать как j?

den73 ★★★★★
() автор топика
Ответ на: комментарий от den73

Нет. Я изначально лишь доказываю тезис «для русских слов возможно взаимнооднозначное преобразование, если в яролите мягкий знак представлять как j, а не как q».

monk ★★★★★
()
Ответ на: комментарий от monk

Если топонимы, имена и названия организаций не являются русскими словами, то контрпример на конфликт префиксного смысла j я, пожалуй, придумать не могу. На этом тема не закрыта, поскольку про твёрдый знак ничего не сказано - а он ведь jq. Т.е. такая реформа не позволит избавиться от q.

И непонятно, какой практический смысл от транслита, в котором нельзя представить произвольное находящееся в документах России слово.

Т.е. заменить можно, но смысла делать это нет. Если нужен дефективный транслит, то таких уже вполне достаточно.

den73 ★★★★★
() автор топика
Последнее исправление: den73 (всего исправлений: 1)
Ответ на: комментарий от den73

На этом тема не закрыта, поскольку про твёрдый знак ничего не сказано - а он ведь jq. Т.е. такая реформа не позволит избавиться от q.

Твердый знак просто q тогда. Но ты прав, многовато неоднозначностей, нужен обособленный знак для ь. Стандартизаторы ниче лучше апострофа не придумали. Я погуглил, оказывается еще при царизме был транслит как раз с апострофом. Так и тянется с тех пор.

bread
()
Ответ на: комментарий от den73

Как вариант, ья = йа . Возможно, примеры конфликта и есть, но найти не могу. Вот есть варианты с йа, йу, йо в середине слова, но в любом случае перед ними идут гласные.

http://bezbukv.ru/mask/$йа$

den73 ★★★★★
() автор топика
Ответ на: комментарий от Aber

весь бы мир слушал Аллу Пугачеву

Слушал бы, если б она согласилась с Abba петь.

no-such-file ★★★★★
()
Ответ на: комментарий от den73

Ну и просто если погуглить, то можно найти массу текстов, в т.ч. литературных, а также торговых марок или неофициальных переводов топонимов, в которых правила нарушаются. Вот упражнение по русскому языку, однозначно непредставимое.

Запиши слова буквами Ко(л,а) ко(лйа) се(ма) се(мйа) по(ло)т по(лйо)т со(лу) со(лйу)

den73 ★★★★★
() автор топика
Ответ на: комментарий от bread

Твердый знак просто q тогда. ... Стандартизаторы ниче лучше апострофа не придумали. Я погуглил, оказывается еще при царизме был транслит как раз с апострофом.

Кстати, а почему q, а не x, как в азбуке Морзе?

monk ★★★★★
()
Ответ на: комментарий от monk

х неотличимо похож на хер, лучше такого избегать.

bread
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.