代码之家  ›  专栏  ›  技术社区  ›  Denis Palnitsky

如何解码字符串以与Google语言检测API一起使用?

  •  1
  • Denis Palnitsky  · 技术社区  · 16 年前

    我想用 Google Language Detection API 在我的应用程序中检测url参数的语言。例如,用户请求url

    http://myapp.com/q

    收到“俄语”的信息。我是这样做的:

    def get(self):                                            
            url = "http://ajax.googleapis.com/ajax/services/language/detect?v=1.0&q="+self.request.query                        
            try:
                data = json.loads(urllib2.urlopen(url).read())                
                self.response.out.write('<html><body>' + data["responseData"]["language"] +'</body></html>')                                  
            except urllib2.HTTPError, e:
                self.response.out.write( "HTTP error: %d" % e.code )
            except urllib2.URLError, e:
                self.response.out.write( "Network error: %s" % e.reason.args[1])
    

    但总是得到“英语”作为结果,因为url编码在

    http://myapp.com/q?%DD%F2%EE%20%F2%E5%F1%F2

    我试过了 urllib.quote , urllib.urlencode 没有运气。

    我如何解码这个谷歌Api的网址?

    1 回复  |  直到 16 年前
        1
  •  3
  •   Tamás    16 年前

    也许 吧 urllib.unquote 你要找的是:

    >>> from urllib import unquote
    >>> unquote("%DD%F2%EE%20%F2%E5%F1%F2")
    

    这将为您提供一个字符串,其中的字符采用您在URL中使用的任何编码方式。如果要将其重新编码为不同的编码(例如,UTF-8),则必须创建 unicode encode 方法 unicode码

    >>> from urllib import unquote, quote
    >>> import json, urllib2, pprint
    >>> decoded = unicode(unquote("%DD%F2%EE%20%F2%E5%F1%F2"), "windows-1251")
    >>> print decoded
    Это тест
    >>> recoded = decoded.encode("utf-8")
    

    此时,我们有一个UTF-8编码的字符串,但这仍然不适合传递给Google语言检测API:

    >>> recoded
    '\xd0\xad\xd1\x82\xd0\xbe \xd1\x82\xd0\xb5\xd1\x81\xd1\x82'
    

    urllib.quote :

    >>> url = "http://ajax.googleapis.com/ajax/services/language/detect?v=1.0&q=%s" % quote(recoded)
    >>> data = json.loads(urllib2.urlopen(url).read())
    >>> pprint.pprint(data)
    {u'responseData': {u'confidence': 0.094033934,
                       u'isReliable': False,
                       u'language': u'ru'},
     u'responseDetails': None,
     u'responseStatus': 200}