【问题标题】:Google Translate API returns non UTF8 charactersGoogle Translate API 返回非 UTF8 字符
【发布时间】:2020-07-24 12:41:01
【问题描述】:

解决 解决方法见文末

晚上好。

我正在尝试使用 google translate 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é”的回答

但我得到: "pr\303\251f\303\251rer"

我已尝试在我的代码中进行一些调试来解决此错误,其中:

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

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

我在 python 中工作,我的脚本是标签:

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

在标题中

你有什么想法吗?

解决。 我用:

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

【问题讨论】:

    标签: python-3.x encoding utf-8 google-api google-translation-api


    【解决方案1】:

    显然,来自 API 的响应是 html 编码的(所以它是 UTF-8 包裹在 html 编码中,也用于 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.
    

    +信息https://stackoverflow.com/a/48805931/4752223

    【讨论】:

    • 非常感谢。我已经用“魔术”解决了我的问题,但你有完美的答案。非常感谢。
    【解决方案2】:

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

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

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

    # coding: utf-8
    

    如果您希望您的代码将输入和输出解释为 UTF-8,则应明确说明。使用您的代码,我假设(一个问题)是您使用 print (最好写入文件)。在 Windows 上,默认情况下,终端不是 UTF-8,而是旧的“类似 Windows ANSI 和扩展也称为 Windows 1252”编码。

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

    【讨论】:

    • 第一辆坦克为您提供帮助。当我问这个问题时,我简化了我的问题。我不会在终端中打印它。这只是为了调试。我在烧瓶 api 中炒锅。我尝试制作解析 json cmets { "id=1694639": "Je préfère le bleu que le rouge" } 的 api,以便使用模式库将它们翻译成英文以用于工作目的。然后我用他们的原始语言重新翻译它们。最后我发了一个回复。当我想测试我的 api 时,我通过邮递员获得了这个。 "pr\\303\\251f\\303\\251rer": 1, "pr\\303\\251f\\303\\251rer_id": [ "1694639" ] 如何以utf8格式输出?
    • 你看过 API 文档吗?您只使用输出,而不进行解析。神奇的[19:-3] 气味。请正确解析输出,你会得到正确的字符串。
    • 我用 thuis 解决了我的问题 translateTexte = codecs.escape_decode(translatedTexte)[0] translateTexte = translateTexte.decode("utf8") 我搜索了 4 小时,我更紧张地看到我的编解码器方面问题。感谢您的“将输入和输出解释为 UTF-8,您应该明确地说出来”,非常感谢。
    • "# coding: utf-8" 有用的。它声明了Python源文件的编码,但与文件、套接字、数据库等的编码无关。'
    • @MarkTolonen:它是默认值,因此如果强烈建议 UTF-8 不是正确的编码,则不使用它。所以跳过这样的行只能改善事情(例如复制/粘贴代码)。该行的问题:这里有太多人建议将其作为编码问题的解决方案(事实并非如此),因此该行也是问题的原因。
    猜你喜欢
    • 2013-05-20
    • 1970-01-01
    • 2017-06-04
    • 2017-03-27
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 2015-03-07
    相关资源
    最近更新 更多