Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 21, 2009 00:07:58

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

Проблема с unicode

Добрый вечер!
Я в Python я новичек, поэтому просьба особо не злится, т.к., чувствую, вопрос заезжанный. Но в гугле ответа так и не нашел.
Проблема: есть простая программка на Питоне, которая запрашивает xml файл с удаленного сервера, парсит и после этого отсылает по джабберу некоторые данные людям, которые указаны в xml:

# -*- coding: utf-8 -*-

from BeautifulSoup import BeautifulSoup
import sys,os,xmpp,urllib

jid="login@gmail.com"
pwd="password"

jid=xmpp.protocol.JID(jid)
cl=xmpp.Client(jid.getDomain(),debug=[])
cl.connect()
cl.auth(jid.getNode(),pwd)

result = urllib.urlopen("http://server.com/file.xml").read()
xml = BeautifulSoup(result)
for item in xml.findAll('item'):
if (item.type.string == 'jabber'):
cl.send(xmpp.protocol.Message(item.recipient.string, item.message.string))

cl.disconnect()
На локальной машине(MacOS X) все работает замечательно, но стоило загрузить скрипт на удаленный сервер под Ubuntu8.04 x64 и получил следующее:
kolger@server:~/jabber$ python send.py
Traceback (most recent call last):
File “send.py”, line 23, in <module>
cl.send(xmpp.protocol.Message(item.recipient.string, item.message.string))
File “/usr/lib/python2.5/site-packages/xmpp/protocol.py”, line 418, in __init__
if body: self.setBody(body)
File “/usr/lib/python2.5/site-packages/xmpp/protocol.py”, line 431, in setBody
self.setTagData('body',val)
File “/usr/lib/python2.5/site-packages/xmpp/simplexml.py”, line 243, in setTagData
except: self.addChild(tag,attrs,payload=)
File “/usr/lib/python2.5/site-packages/xmpp/simplexml.py”, line 30, in ustr
try: r=what.__str__()
UnicodeEncodeError: ‘ascii’ codec can't encode character u'\u0412' in position 0: ordinal not in range(128)
По запросу “UnicodeEncodeError: ‘ascii’ codec can't encode character” в гугле много всего, но ни одного ответа как это пофиксить. Буду признателен за любую помощь или ссылку. Спасибо большое.



Офлайн

#2 Янв. 21, 2009 01:29:28

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

Проблема с unicode

Еще немного информации:

На удаленной машине:
$ env | grep LANG
LANG=ru_RU.UTF-8
На локальной тоже самое

>>> import sys
>>> sys.getdefaultencoding()
'ascii'
На локальной тоже самое
Проблема проявляется только, когда в строке item.message.string содержится кириллица.



Офлайн

#3 Янв. 21, 2009 01:56:30

shiza
От:
Зарегистрирован: 2007-07-03
Сообщения: 1073
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема с unicode

я подозреваю такой расклад.

BeautifulSoup - парсер умный. на входе он берет UTF-8. Детектит его и декодирует в Unicode. B внутри себя работает уже с чистым Unicode.

В XMPP - же чистый юникод не пролезает, ему подавай неюникодную строку. Поэтому перед передачей, надо закодировать енту строку в нужную кодировку.

И того, вместо cl.send(xmpp.protocol.Message(item.recipient.string, item.message.string))
пишем:

rec = unicode(item.recipient.string) #нам придется сначала явно преобразовать BeautifulSoup.NavigableString в обычныю юникодную строку
mes = unicode(item.message.string) #чтобы с ней удобнее было работать.
cl.send(xmpp.protocol.Message(rec.encode('UTF-8'), mes.encode('UTF-8')) #перед передачей, кодируем unicode в UTF-8



Отредактировано (Янв. 21, 2009 01:57:53)

Офлайн

#4 Янв. 21, 2009 02:08:33

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

Проблема с unicode

Большое спасибо!!!
Оно самое. Все заработало.



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version