Форум сайта python.su
ZZZ, спасибо за картинку
В том то и проблема, когда пишу:
"Post" : 'тест'.encode('cp1251')
b'\xf2\xe5\xf1\xf2'
Офлайн
Что- то я совсем запутался в кодировках Python 3, вот что проверил:
Python2 код возвращает на форуме в теме слово “тест” в нормальной кодировке:
#!/usr/bin/env python2 # -*- coding: utf-8 -*- s_utf8 = u'тест' s_cp1251 = str(s_utf8.encode('cp1251')) postdata = { "TopicTitle" : s_cp1251 } # код requests ...
#!/usr/bin/env python3 # -*- coding: utf-8 -*- s_utf8 = 'тест' s_cp1251 = str(s_utf8.encode('cp1251')) postdata = { "TopicTitle" : s_cp1251 } # код requests ...
#!/usr/bin/env python3 # -*- coding: utf-8 -*- s_utf8 = 'тест' # текст в unicode utf8 (строка) s_uni = s_utf8.encode('utf8') # последовательность байт (unicode) s_cp1251 = s_uni.decode('cp1251') # текст в unicode cp1251 (строка) print(s_utf8) print(s_uni) print(s_cp1251)
����
b'\xd1\x82\xd0\xb5\xd1\x81\xd1\x82'
тест
тест
b'\xd1\x82\xd0\xb5\xd1\x81\xd1\x82'
тест
тест
Отредактировано omatic (Апрель 10, 2013 21:11:31)
Офлайн
не пиши s_utf8, там юникод. пиши s_unicode и просто s в python3
в текстовом файле скрипта utf8, когда интерпритатор его считывает, он конвертирует в unicode
Отредактировано bismigalis (Апрель 10, 2013 21:21:07)
Офлайн
bismigalis
не пиши s_utf8, там юникод. пиши s_unicode и просто s в python3в текстовом файле скрипта utf8, когда интерпритатор его считывает, он конвертирует в unicode
Отредактировано omatic (Апрель 10, 2013 21:28:40)
Офлайн
omaticstr() то тут каким боком? Вам уже несколько раз правильное решение подсказали:
Тот же код на Python3, возвращает b'\xf2\xe5\xf1\xf2'#!/usr/bin/env python3 # -*- coding: utf-8 -*- s_utf8 = 'тест' s_cp1251 = str(s_utf8.encode('cp1251')) postdata = { "TopicTitle" : s_cp1251 } # код requests ...
#!/usr/bin/env python3 s_utf8 = 'тест' s_cp1251 = s_utf8.encode('cp1251') postdata = { "TopicTitle" : s_cp1251 }
postdata = { "TopicTitle" : 'тест'.encode('cp1251') }
Офлайн
наверное теперь request заботливо отправляет представление b'\xf2\xe5\xf1\xf2' вместо самих байтов
Офлайн
reclosedev, сори str() тут не причем, я с примера брал какого-то,но сути не меняет если просто сделать .encode() то посылается последовательность байт
код
#!/usr/bin/env python3 s_utf8 = 'тест' s_cp1251 = s_utf8.encode('cp1251') postdata = { "TopicTitle" : s_cp1251 }
postdata = { "TopicTitle" : 'тест'.encode('cp1251') }
b'\xf2\xe5\xf1\xf2'
Отредактировано omatic (Апрель 10, 2013 23:30:13)
Офлайн
omaticХм. Действительно, в r.request.body b'\xf2\xe5\xf1\xf2' на Python3.
П.С. я так понимаю это баг модуля requests?
Офлайн
reclosedev
А форум не принимает form-urlencoded, т.е. без files={'':''}? Потому что в этом случае все декодируется правильно.
Отредактировано omatic (Апрель 11, 2013 21:00:15)
Офлайн
Получил ответ с git-хаба на багтрекере, так-что использовать только UTF-8 по умолчанию и никак по другому.
Lukasa commented:
Welcome to the exciting world of Python string handling!
The reason this is happening is that, somewhere in the web stack, someone is calling str() on your string. In Python3, calling str() on a bytestring returns the exact same thing as calling repr(). In this case, that's the byte literal form.
Unfortunately, the current rule is that urllib3 must take native strings. This means you cannot encode your post data: they need to stay as unicode, to be encoded later.
Офлайн