Как исправить кривые кодировки Eggdrop & Windrop

Родительская категория: Скрытый Категория: IRC 11.08.2009 18:15 Автор: Buster Просмотров: 23940 Печать

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

Ещё хуже это скрипты ориентированные на библиотеку egglib_pub. Почему? Да потому что неправильная работа бота используется для получения правильного результата, что отводит от стандарта и усложняет, как ни странно, работу скриптов.

Начнем с выбора кодировки, под которой будет работать бот. Для России основная кодировка это cp1251 или же для ОС семейства Windows Win1251, такая же кодировка, в большинстве случаев, используется для передачи данных между IRC сервером и клиентом (в нашем случае ботом) при этом используется порт 6667 (для WeNet).

При заходе на сервер мы можем получить сообщение от сервера, в котором данные кодировки расписаны:
Например для сети WeNet:
- 6667: CP1251 6669: KOI8-F 6671: CP866
- 6668: Translit 6670: KOI8-R 6672: ISO8859-5

Или для RusNet:
- 6666: KOI8-U 7770: KOI8-R 7774: Macintosh
- 6667: KOI8-R 7771: CP1251 7775: Translit
- 6668: Translit 7772: CP866 7776: KOI8-U
- 6669: CP1251 7773: ISO-8859_5 7777: MacRoman

Ко всему прочему большая часть скриптов написана опять же в кодировке cp1251, поэтому лучший вариант использовать её во всех местах:
- ядро бота (локаль+интерпретатор);
- скрипты;
- порт коннекта к серверу.

Теперь рассмотрим проблемы, которые могут повлечь некорректную работу как отдельного скрипта, так и работу всего бота.

1) Самое важное это использование не патченного бота, в котором допущено много ошибок связанных с кодировками. Для не патченного бота характерны перечисленные ситуации: невозможность использование русского ника у бота; некорректное использование встроенных функций работы с юзер листом (.chhandle и др.); моментальное покидание канала после захода, в случае если в имени канал есть русские буквы, некорректное поведение функций tcl при работе со строками в которых содержаться русские буквы. Решение: установка патченного бота.

2) Скрипты имеющие строку encoding system ххх (на текущий момент антиматы и игра в слова). Данная команда меняет системную кодировку бота, что неправильно с точки зрения построения скрипты, если кому, то нужно в какой, то исключительной ситуации поменять системную кодировку бота то он знает, где это и как делается, но ни как не должен этого делать скрипт. Так же данная строка может быть в конфигурационном файле бота. Нам изменение кодировки работы ядра бота не пригодиться, поэтому и данной строки недолжно быть. Решение: закомментировать, либо убрать вообще, данные строки из скриптов и конфигурационного файла.

3) Неправильное использование функций [encoding convertto xxx yyy], [encoding convertfrom xxx yyy]. Под неправильным использованием я понимаю как выбор неправильной кодировки, так и избыточное и недостающее использование функции. Пример избыточного использования скрипты (rss, викторины) в которых полученные данные конвертируются сначала из кодировки страницы, а затем в системную кодировку, либо просто сразу в системную кодировку. В случае недостающего использования перекодировка данных вообще отсутствует. Так же встречаются но в меньшей степени ситуации, где неправильно указана кодировка. Решение: в случае избыточного использования необходимо закомментировать или убрать строку, в которой идет переконвертация; в случае недостающего использования необходимо добавить строку, которая бы переконвертировала данные из нужной кодировки; если выбрана неправильная кодировка, то необходимо только указать правильную.

4) Запуск бота не в той кодировки. Для патченного бота Windrop это не актуально, так как патчь содержит изменение, которое позволяет определять кодировку операционной системы по умолчанию и запускать под ней, рассматривать запуск не патченного бота под Windows я рассматривать не буду. Теперь что же касается юникс систем. Поскольку локаль пользователя, под которым запускается бот, обычно не та которая нужна боту то соответственно и бот будет работать не в правильной кодировки. Но мало кому известно, что запустить приложение, под нужной локалью, можно без изменения локали пользователя. Решение: запуск бота командой LANG=ru_RU.CP1251 LC_TIME=en_US ./eggdrop, при этом не стоит забывать о том, чтобы данные кодировки вообще были установлены в системе (cd /usr/lib/locale && localedef -i ./ru_RU -f CP1251 ./ru_RU.cp1251).

Рейтинг:   / 3
ПлохоОтлично