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

3 投票
2 回答
3672 浏览
提问于 2025-04-16 13:18

我在我的网站上有一个可爱的(斯堪的纳维亚?)用户,他抱怨说我无法在网址中解析他的用户名,因此在他的网站页面上没有显示任何结果。

我很确定浏览器会把请求编码成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

撰写回答