【问题标题】:How to parse a utf-8 encoded query parameter with Python 2.6如何使用 Python 2.6 解析 utf-8 编码的查询参数
【发布时间】:2011-07-11 14:05:46
【问题描述】:

我的网站上有一些可爱的(斯堪的纳维亚?)用户抱怨网址中的 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 变量并未受到干扰。

【问题讨论】:

    标签: python web.py utf8-decode urlparse


    【解决方案1】:
    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
    

    【讨论】:

    • 谢谢,我认为问题在于 web.ctx.fullpath 变量填充不正确,并且以更原始的数据结构返回源数据(如您的示例所示)。
    【解决方案2】:

    请明确地告诉我们你得到了什么......告诉我们repr(target_player)返回的值。

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

    【讨论】:

      猜你喜欢
      • 2012-11-07
      • 1970-01-01
      • 2014-01-24
      • 1970-01-01
      • 2019-09-15
      • 2012-10-08
      • 1970-01-01
      • 2018-06-01
      • 1970-01-01
      相关资源
      最近更新 更多