Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 21, 2010 16:46:48

DelphinCoder
От:
Зарегистрирован: 2009-05-05
Сообщения: 29
Репутация: +  0  -
Профиль   Отправить e-mail  

проблема с unicode

пытаюсь реализовать 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)

Офлайн

#2 Авг. 21, 2010 17:31:23

tmp_a6219205
От:
Зарегистрирован: 2010-08-21
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

проблема с unicode

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



Отредактировано (Авг. 21, 2010 17:40:25)

Офлайн

#3 Авг. 21, 2010 18:19:02

DelphinCoder
От:
Зарегистрирован: 2009-05-05
Сообщения: 29
Репутация: +  0  -
Профиль   Отправить e-mail  

проблема с unicode

собственно ровны счетом ничего не изменилось. что с unicode_if_necessary, что с unicode_literals
сообщение (которое получает бот) стого говоря является кортежем. первым элементом идет само сообщение, вторым кодировка: unicode
однако строка, которую выдает repr - ‘\x04?\x04@\x048\x042\x045\x04B’ - не очень напоминает utf-8.
еще какие-нибудь иде есть?



Офлайн

#4 Авг. 21, 2010 18:35:07

DelphinCoder
От:
Зарегистрирован: 2009-05-05
Сообщения: 29
Репутация: +  0  -
Профиль   Отправить e-mail  

проблема с unicode

после очередных манипуляций вот что получилось:
берем исходную строку
s = ‘x04?\x04@\x048\x042\x045\x04B’

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

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

но что-то меня этот говнокод не устраивает.
помогите плиз!



Офлайн

#5 Авг. 21, 2010 20:19:22

Vader
От:
Зарегистрирован: 2010-01-30
Сообщения: 152
Репутация: +  0  -
Профиль   Отправить e-mail  

проблема с unicode

Попробуйте, не добавляя никаких символов в начало строки, сделать вот так:

print s.decode('utf-16-be')



Отредактировано (Авг. 21, 2010 20:19:47)

Офлайн

#6 Авг. 21, 2010 21:29:03

DelphinCoder
От:
Зарегистрирован: 2009-05-05
Сообщения: 29
Репутация: +  0  -
Профиль   Отправить e-mail  

проблема с unicode

работает!!!!



Офлайн

#7 Авг. 21, 2010 21:44:59

Vader
От:
Зарегистрирован: 2010-01-30
Сообщения: 152
Репутация: +  0  -
Профиль   Отправить e-mail  

проблема с unicode

DelphinCoder
работает!!!!
Естественно :) Курите BOM



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version