1

我想在我的应用程序中使用Google 语言检测 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没有运气。

我必须如何为 Google Api 解码这个 url?

4

1 回答 1

3

也许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'

由于您想将此字符串作为查询参数包含在 URL 中,因此您必须使用以下方法对其进行编码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}
于 2010-10-12T12:51:19.677 回答