Google App Engine UrlFetch - 处理包含特殊字符的URL的问题
我正在使用谷歌翻译把一段文字转换成语音,使用的链接是:
http://translate.google.com/translate_tts?tl=%s&q=%s
这里的参数 tl
是你想转换成语音的文本的语言代码,而 q
是你想转换的文本。
普通的单词(没有特殊字符)能返回正确的音频文件。
所以在我的应用中,我这样做(no
是挪威语的语言代码):
url = "http://translate.google.com/translate_tts?tl=%s&q=%s" % ('no', urllib.quote('kjendis'))
#url = http://translate.google.com/translate_tts?tl=no&q=kjendis
self.response.headers["Content-Type"] = "audio/mpeg"
self.response.out.write(urlfetch.fetch(url).content)
这样能返回正确的声音。
顺便说一下,我使用的是普通的网页应用。
但是当我有一个带特殊字符的单词(比如 vår)时,就出现问题了。
生成的链接是 http://translate.google.com/translate_tts?tl=no&q=v%C3%A5r
。(这里的 å 被正确地转换成了百分比编码)
当我在浏览器中打开这个链接时,能听到正确的声音,但当我用 urlfetch.fetch 来读取同样的链接时,返回的声音就不对了。
这里出了什么问题呢?我只能猜测 fetch 可能在某种程度上改变了这个链接。
1 个回答
0
显然,这个问题不是出在App Engine上,而是和Google Translate的网址如何处理不同的用户代理有关。
举个例子:
#!/usr/bin/env python
#coding=utf-8
import urllib
class MyOpener(urllib.FancyURLopener):
version = "App/1.7" #doesn't work
version = "Mozilla/4.0 (MSIE 6.0; Windows NT 5.0)2011-03-10 15:38:34" #works
def textToSpeech(text, languageCode='en'):
url = "http://translate.google.com/translate_tts?tl=%s&q=%s" % (languageCode, urllib.quote(text))
myopener = MyOpener()
return myopener.open(url, 'rb').read()
open('urllib.mp3', 'wb').write(textToSpeech('vår', 'no'))
当使用Firefox的用户代理字符串时,MyOpener一切正常,但如果使用其他用户代理字符串,返回的声音就不对了。