如何使用Python 2.6解析utf-8编码的查询参数

时间:2011-03-09 03:20:37

标签: python web.py utf8-decode urlparse

我的网站上有一些可爱的(斯堪的纳维亚?)用户在网址中抱怨I cannot parse his username,因此我在他的网页上没有显示他的结果。

我很确定浏览器将请求编码为 http://councilroom.com/player?player=G%C3%B6rling

我想让玩家字符串成为Görling,而不是转换为Görling。

我正在使用带有python 2.6的web.py并尝试按如下方式解析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在某种程度上错误地解析了web.ctx中的完整路径,但是QUERY_STRING变量是不受干扰的。

2 个答案:

答案 0 :(得分:0)

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'中的字节被解释为一系列unicode代码点,将Görling转换为Görling

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

答案 1 :(得分:0)

请明确告诉我们你有什么......告诉我们repr(target_player)返回的价值。

如果值为'G\xc3\xb6rling',则为播放器正确名称的UTF-8编码版本。要获得unicode,您需要对其进行解码。然后你需要考虑使用什么编码来显示它......根据你展示的A-tilde和pilcrow字符判断,它可能是cp1252(或latin1又名iso-8859-1)。