Найти - Пользователи
Полная версия: Qt4,httplib, отправка через POST
Начало » GUI » Qt4,httplib, отправка через POST
1
idler
Я в python новичок, однако немного программировал на PHP, JavaScript (как для веб страниц так и для XUL) , чуть знаю C

Решил попробовать Python и сделать что-то полезное.
Есть такой Twitter-клиент h-twt
Я добавли к нему немного функциональности, научил его отображать timeline в примитивном виде.
И обнаружил, что не могу отправлять в твиттер посты на русском.

Полный исходник тут: http://www.maxantonov.name/MyTwitting.html

Текст для отправки я получаю из QTextEdit
Фрагмент кода:
 def postTweet(self):
mesg = self.txt.toPlainText()
post = urllib.urlencode({ 'status' : mesg })
try:
http = httplib2.Http()
http.force_exception_to_status_code = False
http.add_credentials(self.username, self.password)
resp, content = http.request(self.twitUpdate, 'POST', post)
Ошибка:
max@desktop:~$ htwt
Traceback (most recent call last):
File "/home/max/bin/htwt", line 27, in postTweet
post = urllib.urlencode({ 'status' : mesg })
File "/usr/lib/python2.6/urllib.py", line 1265, in urlencode
v = quote_plus(str(v))
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-6: ordinal not in range(128)
Ясно что дело в кодировках, только в документации я не нашел ничего кроме unicode(string,encoding)
Пробовал применять unicode к значению поля ввода перед отправкой, но в твиттере только знаки вопроса.

Подскажите, куда копать?
системная локаль: ru_RU.UTF-8
poltergeist
Попробуйте сделать mesg = unicode(self.txt.toPlainText()).encode('utf-8')
idler
Большое спасибо. Получилось.
А можно ли ссылку на почитать - что все это значит?
poltergeist
Вы пытались передать данные в юникоде (Qt-шный QString, возвращаемый методом toPlainText(), это аналог юникодовой строки), заранее не закодировав их в нужную кодировку для передачи через HTTP протокол. Пока следует оборачивать результат функций в unicode(), а в дальнейшем это исправят и можно будет писать mesg = self.txt.toPlainText().encode('utf-8').
ZZZ
poltergeist
а в дальнейшем это исправят и можно будет писать mesg = self.txt.toPlainText().encode('utf-8')
Этого иногда очень не хватает… Откуда такие данные?
idler
ZZZ
Этого иногда очень не хватает… Откуда такие данные?
Прежде чем браться за Python я естественно почитал книгу.
Книга была по Python3 там было сказано, что в третьем все строки в utf8.
Насколько я понимаю это и есть эти данные. Верно???
poltergeist
idler Нет, мы тут про другие строки говорим. Все Qt-шные функции работают сейчас не с питоновскими строками, а с классом QString. Просто PyQt автоматом конвертирует QString в unicode, а QByteArray в str. В будущих версиях PyQt таких классов как QChar, QString, QByteArray, QVariant, QDate, QTime, … уже не будет, они будут заменены своими питонскими аналогами. В python 3.0 это будет очень уместно, QString -> str, QByteArray -> bytes - типы данных почти один в один повторяют друг друга.

ZZZ Почитай roadmap на сайте ривербанка, там много интересного по части запланированных фич.
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