Найти - Пользователи
Полная версия: проблема с unicode
Начало » Python для новичков » проблема с unicode
1
DelphinCoder
пытаюсь реализовать 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

хочется понять, как заставить эту срань отправлять сообщения из скрипта и выводить полученные сообщения в консоль в читаемом виде.
обращаю внимание, что проблема именно с русскими сообщениями. на пендосском все пашет.
tmp_a6219205
во первых – есть опеределённая недоработки (не ошибка а просто недоработка!) в функции __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()


…….

ну и конешно можно сильно упростить себе жизнь в Python-2 – тем что:
from __future__ import unicode_literals
….
…..или уж сразу:
from __future__ import absolute_import, division, print_function, unicode_literals
(не дожидаясь следущих (на этот раз не юникодных) проблемм :-D)
DelphinCoder
собственно ровны счетом ничего не изменилось. что с unicode_if_necessary, что с unicode_literals
сообщение (которое получает бот) стого говоря является кортежем. первым элементом идет само сообщение, вторым кодировка: unicode
однако строка, которую выдает repr - ‘\x04?\x04@\x048\x042\x045\x04B’ - не очень напоминает utf-8.
еще какие-нибудь иде есть?
DelphinCoder
после очередных манипуляций вот что получилось:
берем исходную строку
s = ‘x04?\x04@\x048\x042\x045\x04B’

добавляем вначало символы \xfe\xff\ чтобы получилось так:
s = ‘\xfe\xff\x04?\x04@\x048\x042\x045\x04B’
и последний штрих:
print s.decode('utf-16')

и вуаля! в консоль вываливается u'привет'

но что-то меня этот говнокод не устраивает.
помогите плиз!
Vader
Попробуйте, не добавляя никаких символов в начало строки, сделать вот так:
print s.decode('utf-16-be')
DelphinCoder
работает!!!!
Vader
DelphinCoder
работает!!!!
Естественно :) Курите BOM
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB