Как проанализировать параметр запроса в кодировке utf-8 с Python 2.6 - PullRequest
3 голосов
/ 09 марта 2011

У меня есть симпатичный (скандинавский?) Пользователь на моем веб-сайте, который жалуется, что Я не могу разобрать его имя пользователя в URL-адресах, и поэтому я не показываю ему никаких результатов на его странице на моем веб-сайте.

Я почти уверен, что браузер кодирует запросы как http://councilroom.com/player?player=G%C3%B6rling

. Я бы хотел, чтобы строка игрока превратилась в Görling, а не в Görling, который преобразуется в.

Я использую web.py с python 2.6 и пытаюсь проанализировать URL следующим образом

parsed_url = urlparse.urlparse(web.ctx.fullpath)
query_dict = dict(urlparse.parse_qsl(parsed_url.query))
target_player = query_dict['player']

Редактировать: С помощью unutbu я исправил это, изменив его на

query_dict = dict(urlparse.parse_qsl(web.ctx.env['QUERY_STRING']))
target_player = query_dict['player'].decode('utf-8')

Я думаю, что webpy каким-то образом неправильно разбирал fullpath в web.ctx, но переменная QUERY_STRING не имеет значения.

Ответы [ 2 ]

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

Пожалуйста, покажите нам однозначно, что у вас есть ... покажите нам значение, возвращаемое repr(target_player).

Если значение 'G\xc3\xb6rling', это верная версия игрока в кодировке UTF-8название.Чтобы получить юникод, вам нужно его расшифровать.Затем вам нужно подумать, какая кодировка используется для его отображения ... Судя по показанным вами символам A-тильды и Пилкроу, это, вероятно, cp1252 (или latin1 aka iso-8859-1).

0 голосов
/ 09 марта 2011
In [4]: import urlparse

In [6]: parsed_url = urlparse.urlparse('http://councilroom.com/player?player=G%C3%B6rling')

In [7]: parsed_url
Out[7]: ParseResult(scheme='http', netloc='councilroom.com', path='/player', params='', query='player=G%C3%B6rling', fragment='')

In [8]: query_dict = dict(urlparse.parse_qsl(parsed_url.query))

In [9]: query_dict
Out[9]: {'player': 'G\xc3\xb6rling'}

Обратите внимание на .decode('utf-8'):

In [10]: target_player = query_dict['player'].decode('utf-8')

In [11]: target_player
Out[11]: u'G\xf6rling'

In [12]: print(target_player)
Görling

PS. Каким-то образом байты в str объекте 'G\xc3\xb6rling' интерпретировались как последовательность кодовых точек юникода с эффектом превращения Görling в Görling:

In [3]: print(u'G\xc3\xb6rling')
Görling
...