如何解码字符串以用于谷歌语言检测API?

1 投票
1 回答
752 浏览
提问于 2025-04-16 05:22

我想在我的应用程序中使用Google语言检测API来检测网址参数的语言。比如用户请求的网址是:

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])

但是总是得到“英语”作为结果,因为网址是以

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

这种方式编码的。

我尝试过urllib.quote , urllib.urlencode,但没有成功。

我该如何解码这个网址以便使用Google API?

1 个回答

3

也许你需要的是 urllib.unquote

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

这个方法会给你一个字符串,里面的字符是你在网址中使用的编码格式。如果你想把它转换成另一种编码(比如说,UTF-8),你需要先创建一个 unicode 对象,然后用这个 unicode 对象的 encode 方法来进行编码转换:

>>> 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编码的字符串,但这仍然不适合直接传给谷歌的语言检测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}

撰写回答