![]() |
Модераторы: korob2001, ginnie |
![]() ![]() ![]() |
|
Зюзе |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 27.2.2009 Репутация: нет Всего: нет |
Здравствуйте уважаемые перловоды и перловодки
![]() Буду совсем краток, сейчас пилю малюсенького jabber бота который будет перекодировать переданый ему покоцаный текст в читабельный формат, проблема в том, что сервер насколько я понял передает и принимает сообщения в utf-8 вот пример входящего сообщения: $message = ' хЧБЦБЕНЩК ЛМЙЕОФ! уРБУЙВП, ЮФП ЧПУРПМШЪПЧБМЙУШ ХУМХЗБНЙ пФ чБУ ОЕ РПУФХРЙМЙ ДЕОЕЦОЩЕ УТЕДУФЧБ ДМС ЪБЮЙУМЕОЙС ПЗМБУОП ТЕЕУФТХ' пока допетрил, что к входящим сообщениям надо применить utf8::decode($message) получал отвал Uncaught exception from user code: Wide character in subroutine entry at /usr/local/lib/perl5/5.8.9/mach/Encode.pm line 174. сейчас при print encode('cp1251', $message); выводит читаемое сообщение, т.е:
вот кусок бота который принимает, декодирует и отправляет обратно сообщение:
но, если я раскомментирую строчку utf8::encode($message) обратно текст приходит вот в таком виде:
подскажите как победить эти кракозябры ? ![]() ![]() ![]() |
||||||
|
|||||||
okanatov |
|
|||
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 15.2.2010 Репутация: нет Всего: нет |
А другие способы можно предлагать?
Если есть возможность устанавливать модули, посмотри Convert::Cyrillic. Может он лучше подойдёт? |
|||
|
||||
sir_nuf_nuf |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 920 Регистрация: 6.1.2008 Репутация: 14 Всего: 31 |
разберись что тебе приходит по сети.
Как я понимаю должно работать по типу shitirliz ? т.е. юзер вводит кракозябры, бот их раскодирует и присылает нормальный текст. Так ? Тогда а) если джаббер тебе передает данные закодированные в utf8, то прежде всего нужно my $data = decode('UTF8', $data); б) если джаббер при передаче не кодирует данные (а просто требует чтобы они были utf8), то хватит utf8::downgrade($data); в) после этого у вас есть сырые данные. вы подбираете кодировку: $data = guesssss($data); г) кодируете это обратно в utf8 (что бы джабер мог передавать) $data = encode('UTF8', $data) д) proffit =) |
|||
|
||||
Зюзе |
|
||||||||||
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 27.2.2009 Репутация: нет Всего: нет |
не хотелось бы дополнительный модуль ставить там где можно обойтись стндартными Добавлено через 1 минуту
именнно, лабаю замену штирлицу ))) но profit пока не наблюдается ![]() сейчас после
в ответ приходит вот что:
дампер выдал:
|
||||||||||
|
|||||||||||
vadiml |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 27.7.2007 Репутация: 5 Всего: 7 |
jabber всегда работает в utf8.
А по поводу передач -- старайтесь всегда исходить из условия что Вы получаете данные со снятым флагом utf8, и отправлять тоже со снятым, т.е. ставить/снимать флаг надо на границе своего кода. Если Вы сомневаетесь если ли флаг, используйте utf8::decode() -- эта функция сначала проверяет наличие флага, или сами его проверяйте. Если Вам нужен utf8, то в своём коде везде используйте с установленным флагом, иначе Вы замаетесь с его проверкой, снятием и установкой. Если у Вас в коде utf8 не нужна -- избавляйтесь от неё сразу при получении данных. Можете посмотреть Net::Whois::Raw -- когда я переводил его на utf8 для приёма данных в куче разных кодировок, перепробовал кучу способов, думаю что описанное здесь -- самое оптимальное. |
|||
|
||||
sir_nuf_nuf |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 920 Регистрация: 6.1.2008 Репутация: 14 Всего: 31 |
могу еще посоветовать не Data::Dumper а Devel::Peek.
примерно так
Он показывает какие флаги стоят на скаляре Это сообщение отредактировал(а) sir_nuf_nuf - 18.2.2010, 10:03 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Perl" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |