суббота, 12 мая 2012 г.

Python UnicodeEncodeError: 'ascii' codec can't encode character

Я столкнулся с данной проблемой используя urllib.urlencode() для формирования POST запроса с юникодом внутри. Кто-то возможно сталкивался с этой ошибкой и при других обстоятельствах.

Проблема заключается в том, что urlencode применяет ко всем элементам передаваемого dict'а метод str() который и генерирует ошибку, когда ему пытаются скормить под видом строки не ASCII символы.

В Django проблема решается очень просто. Прежде чем отдавать параметры POST запроса в urlencode() нужно обработать их методом smart_str():

>>> import urllib
>>> from django.utils.encoding import smart_str
>>>
>>> data = {'name' : u'Иван'}
>>> data = smart_str(data)
>>> print urllib.urlencode(data)

Источники: