首页 > 解决方案 > 脚本中的 UTF8 不匹配

问题描述

我对 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 â ? |

标签: pythonpython-3.xpython-requestsmojibake

解决方案


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

我怀疑谷歌在解码 URL 参数时会这样做;过去 URL 参数可以用任意数量的编解码器进行编码,现在 UTF-8 是一个相对较新的标准。这是 Google 的错,不是你的错,也不是requests.

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

您还应该确保您的 URL 字符串是正确的百分比编码,如果您在字典中传递参数,params那么requests将负责将这些参数正确添加到 URL:

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字典中,并从结果列表中提取了输入和输出行值。


推荐阅读