UTF8 несоответствие в сценарии - PullRequest
0 голосов
/ 25 мая 2018

У меня проблемы со скриптом Python.Я просто пытаюсь перевести некоторые предложения с помощью API Google Translate.Некоторые предложения имеют проблемы со специальной кодировкой 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 голосов
/ 27 мая 2018

Google подал вам Моджибаке ;ответ JSON содержит данные, которые были изначально закодированы с использованием UTF-8, но затем были декодированы с использованием другого кодека, что привело к неверным данным.

Я подозреваю, что Google делает это, поскольку декодирует параметры URL;В прошлом параметры URL могли быть закодированы в любом количестве кодеков, то, что UTF-8 теперь является стандартом, является относительно недавней разработкой.Это вина Google, а не ваша или requests.

. Я обнаружил, что установка заголовка User-Agent заставляет Google вести себя лучше;даже (неполного) пользовательского агента Mozilla/5.0 здесь достаточно, чтобы Google использовал UTF-8 при декодировании параметров URL-адреса.

Вы также должны убедиться, что строка 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 и вытащил значения строк ввода и вывода из списков результатов.

...