Проклятая буква.
Все знают, что в любом MUD'е масса проблем с буквой 'я'. Откуда они берутся? Попробуем разобраться и понять, как с этим бороться.
Все дело в том, что 'я' (ANSI-код 255) в понимании протокола telnet это никакая не буква. Это IAC (Interpret As Command - понимать как команду) - специальный символ, обозначающий, что вся оставшаяся за ним строка это команда tenet. Более того, если мы бездумно передадим букву 'я' (обратите внимание - 'я' - маленькая, большая абсолютно нормальна), может случится вообще все, что угодно, например MUD будет ждать ввода дальнейших команд и приостановит обработку.
Теперь, когда более или менее ясно, в чем корень проблемы, поговорим о способах ее решения. Повсеместно применяется такой хитрый прием: IAC посылается не один (что приводит к вышеуказанным последствиям), а два, потому что два рядом стоящих IAC'а считаются просто двумя обычными символами. Вуаля! Вот и решение: нужно перед посылкой дублировать IAC, а после приема убирать лишний.
MUD наш делает так: получив IAC или два IAC'а (неважно, в какой кодировке), он сводит все к букве 'я' и дальше обрабатывает. Можно посылать как один, так и два символа, но я бы рекомендовал все же дублировать букву 'я' при посылке. Как это сделать с точки зрения настройки клиента, будет рассказано позже.
Отправляет же MUD всегда два IAC'а. Дальше уже проблема клиента: показывать ли как есть, или резать (о настройке, также после).
Тут вроде все ясно, уточню только один момент: зачем нам две Win-кодировки. Отличаются они только одним: кодировка 2 ни при каких обстоятельствах не пошлет IAC (ни одинарный, ни двойной) клиенту. Вместо этого он заменяет его большой буквой 'Я' (заметьте: двойной, чтобы не перенастраивать клиент). Зачем это нужно? Дело в том, что некоторые клиенты (например, zMUD) вообще не могут принимать IAC (даже двойной). Прочие клиенты (JMC, MMC, :) можно настроить на работу с четвертой кодировкой и на посылку/прием пар IAC'ов.
Настройка клиентов
Клиент JMC: тут все просто. Сгодятся любые настройки, правда если вы хотите получать эстетическое удовольствие, нужно зайти в Options->Substitutions (Опции->Замены) и выставить переключатели Send IAC и Receive IAC (Посылать IAC, Получать IAC). В положение Double (Двойной).
Клиент MMC: тут немного посложнее. Отправку настраивать не надо: MMC всегда посылает двойной IAC. Чтобы получать одинарный IAC вставьте следующий скрипт в свой .ini файл (кто пользуется MMC - сумеет ;) ):
hook {
my $str=shift;
$str=~tr/я/Я/;
return $str;
}"send";
Клиент zMUD: надо ввести в командой строке
#ONINPUT {я} {#SUBSTITUTE Я} "" {nocr|case|verbatim}{}
#ONINPUT {Я} {#SUBSTITUTE Я} "" {nocr|case|verbatim}{}
#TRIGGER {Я} {#sub я} {case}
и тогда большая буква Я будет меняться на маленькую я.... единственный недостаток:
Если тебе будет с муда приходить РЕАЛЬНАЯ "Я" (то есть например начало предложения в телле,
например "Я ушел", то сия "Я" тоже бует маленькой. (c) Harden + Orlangur
|