Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Perl: Общие вопросы > трабл с Encode и utf |
Автор: Зюзе 15.2.2010, 17:40 | ||||||
Здравствуйте уважаемые перловоды и перловодки ![]() Буду совсем краток, сейчас пилю малюсенького 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 15.2.2010, 19:22 |
А другие способы можно предлагать? Если есть возможность устанавливать модули, посмотри Convert::Cyrillic. Может он лучше подойдёт? |
Автор: sir_nuf_nuf 16.2.2010, 10:02 |
разберись что тебе приходит по сети. Как я понимаю должно работать по типу shitirliz ? т.е. юзер вводит кракозябры, бот их раскодирует и присылает нормальный текст. Так ? Тогда а) если джаббер тебе передает данные закодированные в utf8, то прежде всего нужно my $data = decode('UTF8', $data); б) если джаббер при передаче не кодирует данные (а просто требует чтобы они были utf8), то хватит utf8::downgrade($data); в) после этого у вас есть сырые данные. вы подбираете кодировку: $data = guesssss($data); г) кодируете это обратно в utf8 (что бы джабер мог передавать) $data = encode('UTF8', $data) д) proffit =) |
Автор: Зюзе 16.2.2010, 12:45 | ||||||||||
не хотелось бы дополнительный модуль ставить там где можно обойтись стндартными Добавлено через 1 минуту
именнно, лабаю замену штирлицу ))) но profit пока не наблюдается ![]() сейчас после
в ответ приходит вот что:
дампер выдал:
|
Автор: vadiml 17.2.2010, 23:01 |
jabber всегда работает в utf8. А по поводу передач -- старайтесь всегда исходить из условия что Вы получаете данные со снятым флагом utf8, и отправлять тоже со снятым, т.е. ставить/снимать флаг надо на границе своего кода. Если Вы сомневаетесь если ли флаг, используйте utf8::decode() -- эта функция сначала проверяет наличие флага, или сами его проверяйте. Если Вам нужен utf8, то в своём коде везде используйте с установленным флагом, иначе Вы замаетесь с его проверкой, снятием и установкой. Если у Вас в коде utf8 не нужна -- избавляйтесь от неё сразу при получении данных. Можете посмотреть Net::Whois::Raw -- когда я переводил его на utf8 для приёма данных в куче разных кодировок, перепробовал кучу способов, думаю что описанное здесь -- самое оптимальное. |
Автор: sir_nuf_nuf 18.2.2010, 10:01 | ||
могу еще посоветовать не Data::Dumper а Devel::Peek. примерно так
Он показывает какие флаги стоят на скаляре |