Google 翻译 API returns 非 UTF8 字符

Google Translate API returns non UTF8 characters

解决 解决方法见文末post

晚上好。

我正在尝试使用 google 翻译 v3 api。

我遇到了一个神秘的编码问题。

我这样做 :

def translate_text_langueTarget(texteToTranslate, langueTarget):
     parent = client.location_path(project_id, location)
     langueOrigin = detect_language(texteToTranslate)
     if (langueOrigin == "en" and langueTarget == "en"):
         return(texteToTranslate)
     try:
         response = client.translate_text(
             parent=parent,
             contents=[texteToTranslate],
             mime_type='text/plain',
             source_language_code=langueOrigin,
             target_language_code=langueTarget)
         translatedTexte = str(response.translations)[19:-3]
     except:
         translatedTexte = "Sorry my friend, the translation is lost on the internet"

     print(response)
     print(type(response))
     print(response.translations)
     print(type(response.translations))
     return(translatedTexte)

我称之为

stringToTrad = "prefer"
langTarget = "fr"
translateString = translate_text_langueTarget(stringToTrad, langTarget)

我希望得到“préféré”的回答

但我得到: “pr31f31rer”

我尝试通过在我的代码中进行一些调试来解决这个错误,方法是:

print(response)
print(type(response))
print(response.translations)
print(type(response.translations))

我认为这是编码问题,但我找不到问题的答案。

我在 python 工作,我的股票是 tag :

#! /usr/bin/env python3
# coding: utf-8

在header

你有什么想法吗?

解决。 我使用:

translatedTexte = codecs.escape_decode(translatedTexte)[0]
translatedTexte = translatedTexte.decode("utf8")

API of Google Translate 为您提供 UTF-8 文本。 你得到 c3 a9(303 251 作为八进制数),正如预期的那样,它实际上是 é

因此您的代码采用正确的 UTF-8 文件并将其写入可能是错误的编码。

这句话只是一个神话,没有用:

# coding: utf-8

如果您希望您的代码将输入和输出解释为 UTF-8,您应该明确说明。对于您的代码,我假设(一个问题)是您使用打印(最好写入文件)。在 Windows 上,默认情况下,终端不是 UTF-8,而是旧的“Windows ANSI like and extended also known as Windows 1252”编码。

所以写入一个文件(使用明确的 UTF-8 编码),或者只是更改终端设置,以获得 UTF-8 终端。此外,您可能在结果中有转义序列。对我来说,以八进制方式编写结果闻起来很香。不考虑标准 Python (它会抱怨错误的编码)。您可能需要解析响应,以翻译转义序列。

显然,来自 API 的响应是 html 编码的(因此它是包装在 html 编码中的 UTF-8,也用于 URL 编码)。

解决方法很简单。

import html

print(sf)
# Vinken rejoindra le conseil d'administration en novembre.

print(html.unescape(sf))
# Vinken rejoindra le conseil d'administration en novembre.

+信息