脚本中的UTF8不匹配

时间:2018-05-25 20:46:32

标签: python python-3.x python-requests mojibake

我遇到Python脚本问题。我只是试着用谷歌翻译API翻译一些句子。有些句子有特殊的UTF-8编码问题,如ä,ö或ü。无法想象为什么有些句子有效,有些则没有。

如果我在浏览器中直接尝试API调用,它可以工作,但在我的Python脚本中我得到了不匹配。

这是我的脚本的一个小版本,直接显示错误:

# -*- encoding: utf-8' -*-
import requests
import json

satz="Beneath the moonlight glints a tiny fragment of silver, a fraction of a line…"
url = 'https://translate.googleapis.com/translate_a/single?client=gtx&sl=en&tl=de&dt=t&q='+satz
r = requests.get(url);
r.text.encode().decode('utf8','ignore')
n = json.loads(r.text);
i = 0
while i < len(n[0]):
    newLine = n[0][i][0]
    print(newLine)
    i=i+1

这就是我的结果:

Unter dem Mondschein glänzt ein winziges Silberfragment, ein Bruchteil einer Li
nie â ? |

1 个答案:

答案 0 :(得分:1)

Google为您提供了Mojibake; JSON响应包含使用UTF-8进行原始编码的数据,但随后使用不同的编解码器进行解码,导致数据不正确。

我怀疑Google会在解码网址参数时执行此操作;在过去,URL参数可以编码为任意数量的编解码器,UTF-8现在的标准是相对较新的开发。这是Google的错,不是您的错,也不是requests的错误。

我发现设置User-Agent标题会让Google表现得更好;甚至Mozilla/5.0的{​​不完整的)用户代理也足以让Google在解码您的网址参数时使用UTF-8。

您还应该确保您的网址字符串为properly percent encoded,如果您将字典中的参数传递给params,那么requests将会正确地将这些参数添加到网址中:

satz = "Beneath the moonlight glints a tiny fragment of silver, a fraction of a line…"
url = 'https://translate.googleapis.com/translate_a/single?client=gtx&dt=t'
params = {
    'q': satz,
    'sl': 'en',
    'tl': 'de',
}
headers = {'user-agent': 'Mozilla/5.0'}
r = requests.get(url, params=params, headers=headers)
results = r.json()[0]
for inputline, outputline, *__ in results:
    print(outputline)

请注意,我也将源语言和目标语言参数提取到params字典中,并从结果列表中提取输入和输出行值。