如何用Python 2.6解析UTF-8编码的查询参数
我在我的网站上有一个可爱的(斯堪的纳维亚?)用户,他抱怨说我无法在网址中解析他的用户名,因此在他的网站页面上没有显示任何结果。
我很确定浏览器会把请求编码成http://councilroom.com/player?player=G%C3%B6rling这样的格式。
我希望能把玩家的名字变成Görling,而不是现在显示的Görling。
我正在使用web.py和Python 2.6,尝试这样解析网址:
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
请明确地告诉我们你得到了什么……给我们看看 repr(target_player)
返回的值。
如果这个值是 'G\xc3\xb6rling'
,那么这是玩家名字的 UTF-8 编码版本。要获取正确的 Unicode 名字,你需要对它进行解码。接下来,你还需要考虑显示这个名字时使用的编码……根据你展示的 A-波浪号和段落符号来看,可能是使用了 cp1252 编码(或者叫 latin1,也就是 iso-8859-1)。
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
补充说明一下,某种情况下,str
对象中的字节 'G\xc3\xb6rling'
被当作一串unicode编码来理解,这样就把 Görling
变成了 Görling
:
In [3]: print(u'G\xc3\xb6rling')
Görling