Джанго: работа с параметрами, отличными от ascii - PullRequest
2 голосов
/ 18 марта 2011

Я столкнулся с проблемой, связанной с параметрами POST, отличными от ascii. Вот запрос CURL, который показывает проблему:

curl "http://localhost:8000/api/txt/" -d \
"sender=joe&comments=Bus%20%A3963.33%20London%20to%20Sydney"

Знак фунта в comments вызывает проблему: когда я пытаюсь сделать что-нибудь с request.POST['comments'], я получаю:

UnicodeEncodeError: 'ascii' codec can't encode character u'\ufffd' in position 4: ordinal not in range(128)

Например, если я просто попытаюсь записать, что такое comments:

message = request.POST.get('comments', None)
file('/tmp/comments.txt', 'wb').write(message)

Я получаю вышеуказанную ошибку. Или когда я пытаюсь декодировать его, я получаю ту же ошибку:

try:
    message = message.decode('ISO-8859-2','ignore').encode('utf-8','ignore')
except Exception, e:
    file('/tmp/ERROR-decode.txt','w').write(str(e))

производит ERROR-decode.txt с:

'ascii' codec can't encode character u'\ufffd' in position 4: ordinal not in range(128)

Идеи

Ответы [ 2 ]

2 голосов
/ 18 марта 2011

%A3 неверно. На самом деле это должно быть %C2%A3 или %C5%81, чтобы быть правильным UTF-8.

Также, «Юникод в Python, полностью демистифицирован» .

0 голосов
/ 18 марта 2011

Я думаю, вы должны сначала передать его в urllib.unquote (), чтобы удалить кавычки, выполняемые HTTP, затем вы можете преобразовать строку в Unicode с правильной кодировкой

>>> unicode(urllib.unquote("Bus%20%A3963.33%20London%20to%20Sydney"), \
            "iso-8859-2").encode("utf-8") 
'Bus \xc5\x81963.33 London to Sydney'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...