Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Google应用程序引擎UrlFetch-URL中带有特殊字符的问题_Python_Google App Engine_Urlfetch - Fatal编程技术网

Python Google应用程序引擎UrlFetch-URL中带有特殊字符的问题

Python Google应用程序引擎UrlFetch-URL中带有特殊字符的问题,python,google-app-engine,urlfetch,Python,Google App Engine,Urlfetch,我正在使用Google Translate将一段文本转换为具有以下url的语音: http://translate.google.com/translate_tts?tl=%s&q=%s 其中,参数tl包含要转换为语音的文本语言的语言代码,q包含要转换的文本 正常单词(无特殊字符)返回正确的音频文件。 因此,在我的应用程序中,我就是这样做的(no是挪威语的语言代码): 这将返回正确的声音。 顺便说一句,我正在使用普通的webapp 但是,当我有一个带有特殊字符的单词(vår)时,有些东西就不对了

我正在使用Google Translate将一段文本转换为具有以下url的语音:
http://translate.google.com/translate_tts?tl=%s&q=%s

其中,参数
tl
包含要转换为语音的文本语言的语言代码,
q
包含要转换的文本

正常单词(无特殊字符)返回正确的音频文件。
因此,在我的应用程序中,我就是这样做的(
no
是挪威语的语言代码):

这将返回正确的声音。
顺便说一句,我正在使用普通的webapp

但是,当我有一个带有特殊字符的单词(vår)时,有些东西就不对了。 生成的url是
http://translate.google.com/translate_tts?tl=no&q=v%C3%A5r
。(å正确转换为百分比编码)
当用浏览器打开该url时,我得到了正确的声音,但当使用urlfetch.fetch读取同一url时,返回的声音不正确


这里出了什么问题?我只能假设fetch正在以某种方式改变url。

显然,问题不是应用程序引擎的问题,而是Google Translate url处理不同用户代理的方式

例如:

#!/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'))

为MyOpener使用Firefox用户代理字符串时,一切正常,但使用其他用户字符串时,返回的声音不正确。

什么功能是
quote
?您是否尝试过为某个应用程序的编码字符串创建urlfetch,在该应用程序中您可以看到获取的结果URL(例如,您自己的应用程序)?我使用的是urllib.quote。我按照你的要求做了,结果是一样的。似乎url没有被更改:/Err,经过一番探索后,我想我发现了问题所在。。将用户代理更改为Firefox代理后,一切正常。。下面是一个说明问题的代码示例:更改UrlOpener的version属性并了解结果如何更改。还用我的Appengine应用程序测试了它,这确实是问题所在。。。你知道为什么会这样吗?我有点好奇。我不知道,但我只能假设一些浏览器对unicode编码不正确,所以API就是基于这一点来区分的。
#!/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'))