Форум сайта python.su
пытаюсь реализовать icq бота на основе 4го поста из темы http://python.su/forum/viewtopic.php?id=1914
уже целый день бьюсь с одной проблемой: не получается отправить русские сообщения из бота. также если вывести print-ом присланное сообщение - выводятся одни кракозябры.
однако если переслать оправителю его сообщение - все замечательно отображается.
вот пример общения с ботом:
Я: привет
brainfucker: привет
brainfucker ‘\x04?\x04@\x048\x042\x045\x04B’
brainfucker: 킷킴킰톀킾킲킰℡
эти три его овтета формируются так:
обратная пересылака входящего сообщения
обратная пересылака repr(входящего сообщения)
отправка сообщения u'привет', забитого в скрипт
в начале скрипта стоит указание, что кодировка utf-8
сам скрипт сохранен именно в utf-8
хочется понять, как заставить эту срань отправлять сообщения из скрипта и выводить полученные сообщения в консоль в читаемом виде.
обращаю внимание, что проблема именно с русскими сообщениями. на пендосском все пашет.
Отредактировано (Авг. 21, 2010 16:48:34)
Офлайн
во первых – есть опеределённая недоработки (не ошибка а просто недоработка!) в функции __repr__ для типов “str” и “unicode”
(^^^— это разумеется всё касается только Python-2.X —^^^)
во вторых – нада не забывать что тип “str” он НЕ для строк (а для двоичных данных. для строк используется ТОЛЬКО тип “unicode”… )
тоесть может быть вы-то отправляете роботу кошеный “unicode” … но вот что присылает вам робот? str ? в этом случае – незабывайте преобразовывать str в unicode
def unicode_if_necessary(obj):
try:
if isinstance(obj, str):
return obj.decode(u'UTF-8')
elif isinstance(obj, unicode):
return obj
else:
return unicode(obj)
except ValueError:
return unicode()
from __future__ import unicode_literals
from __future__ import absolute_import, division, print_function, unicode_literals
Отредактировано (Авг. 21, 2010 17:40:25)
Офлайн
собственно ровны счетом ничего не изменилось. что с unicode_if_necessary, что с unicode_literals
сообщение (которое получает бот) стого говоря является кортежем. первым элементом идет само сообщение, вторым кодировка: unicode
однако строка, которую выдает repr - ‘\x04?\x04@\x048\x042\x045\x04B’ - не очень напоминает utf-8.
еще какие-нибудь иде есть?
Офлайн
после очередных манипуляций вот что получилось:
берем исходную строку
s = ‘x04?\x04@\x048\x042\x045\x04B’
добавляем вначало символы \xfe\xff\ чтобы получилось так:
s = ‘\xfe\xff\x04?\x04@\x048\x042\x045\x04B’
и последний штрих:
print s.decode('utf-16')
и вуаля! в консоль вываливается u'привет'
но что-то меня этот говнокод не устраивает.
помогите плиз!
Офлайн
Попробуйте, не добавляя никаких символов в начало строки, сделать вот так:
print s.decode('utf-16-be')
Отредактировано (Авг. 21, 2010 20:19:47)
Офлайн
работает!!!!
Офлайн
Офлайн