1
import http.client, urllib.request, urllib.parse, urllib.error

def translate(IN, OUT, text):
    text = urllib.parse.quote(text)
    conn = http.client.HTTPConnection("translate.google.com.tr")
    conn.request("GET", "/translate_a/t?client=t&text="+text+"&hl="+IN+"&tl="+OUT)
    res = conn.getresponse().read().decode("cp1254",'replace')
    print(res)
    b1 = res.split("],[")
    b2 = b1[0].strip('[]')
    b3 = b2.strip('","')
    b4 = b3.split('","')
    return b4[0]

string = input("Turkish >>> English: ")
result = translate("tr","en",string)
print(string,">>>",result)

我正在尝试编写一个可以将土耳其语翻译成英语的脚本。如果我不输入土耳其字符,该脚本效果很好。例如,这些土耳其语单词翻译成功 = (kalemlik,deneme,bilgisayar,okyanus) 但如果我输入的单词包含非 ascii 字符,则翻译不成功。这些是土耳其语字符 = ("ıİğĞüÜşŞöÖçÇ"),这些是一些土耳其语单词具有非 ascii 字符 = (programcı,şarkı,çalışma,örnek,İnsan,dağ,üs)。顺便说一句,cp1254 是土耳其字符的有效编码。我能做些什么来解决这个问题?你知道,它不仅适用于土耳其语。

例子;

Turkish >>> English: okyanus
[[["ocean","okyanus","",""]],[["isim",["ocean","brine","the deep","main","drink"],[["ocean",["okyanus","derya"]],["brine",["tuzlu su","salamura","deniz","okyanus"]],["the deep",["deniz","okyanus","enginler"]],["main",["ana boru","deniz","kuvvet","zor","okyanus","horoz dövüşü"]],["drink",["içmek","içki","içecek","içki içmek","deniz","okyanus"]]]],["sıfat",["oceanic"],[["oceanic",["okyanus","okyanusta bulunan","okyanus gibi"]]]]],"tr",,[["ocean",[5],1,0,999,0,1,0]],[["okyanus",4,,,""],["okyanus",5,[["ocean",999,1,0],["oceanic",0,1,0],["the ocean",0,1,0],["oceans",0,1,0]],[[0,7]],"okyanus"]],,,[["tr"]],2]
okyanus >>> ocean

那是成功的。

    Turkish >>> English: dağ
[[["daÄ\u0178","daÄ\u0178","",""]],,"tr",,[["daÄ\u0178",[5],1,0,1000,0,1,0]],[["daÄ\u0178",5,[["daÄ\u0178",1000,1,0]],[[0,4]],"daÄ\u0178"]],,,[["tr"]],8]
dağ >>> daÄ\u0178

失败!

4

2 回答 2

0

仔细观察,你会发现一堆错误和不正确的假设。像

“顺便说一下,CP1254 是土耳其字符的有效编码。”

是的,确实如此,但还有其他标准,例如 ISO 8859-9,它不仅是 Microsoft 使用的实际国际标准。当然还有 UTF-8/16/32。

此外,您不仅在使用 CP1254 时没有检查这是否真的是 Google 使用的解码器(它不是),而且您没有以正确的编码发送单词。我在第一次通读时错过了这一点,因为你的问题集中在你得到了什么。直到第二次通读我才意识到你的主要问题实际上是当你有一个非 ascii 字符时翻译失败。

您还发送了一个字符 (ğ) 并返回了两个字符,这就是为什么我认为 UTF8 是问题所在,而且确实如此,但不是我最初想的那样。

由于您通过 HTTP GET 发送它,因此您必须对 URL 中的文本进行编码,这意味着您基本上必须使用 UTF-8。但你的 GET 并没有这么说。您的请求中没有任何内容表明您正在使用 UTF-8。现在,您确实应该设置一些阅读器来执行此操作,但这很复杂,而且谷歌翻译允许您作弊。你可以传入ie参数,说明你有什么编码。

如果您不这样做,它可能会退回到 ISO-8859-1,这在这些情况下是标准的。这将占用您为 ğ 发送的两个字节并假设它们是两个不同的字符,这就是您将这两个字符取回的原因。

最后,您应该查看标头以了解 Google 用于响应的编码。但在这里你也可以作弊,通过oe参数告诉谷歌使用什么编码。

所以如果你改变:

conn.request("GET", "/translate_a/t?client=t&text="+text+"&hl="+IN+"&tl="+OUT)

到:

path = "/translate_a/t?client=t&ie=UTF-8&oe=UTF-8&text="+text+"&hl="+IN+"&tl="+OUT
conn.request("GET", path)

(因为说真的,你不必把所有东西都排成一行)

并改变:

response = conn.getresponse()
res = response.read().decode("UTF-8",'replace')

它会起作用的。

于 2012-08-31T01:21:15.157 回答
0

对于输入,您不需要做任何事情urlencode()来处理,对于输出,您可以使用Content-Type标头:

import cgi
from urllib.parse   import urlencode
from urllib.request import urlopen

logger = logging.getLogger(__name__)

def translate(text, from_lang=None, to_lang="en"):
    query = dict(text=text, tl=to_lang, client="t",
                 sl=from_lang if from_lang is not None else "auto")
    url = 'http://translate.google.com.tr/translate_a/t?' + urlencode(query)
    print(url)

    try:
        response = urlopen(url)
        content = response.read()
    except OSError as e:
        logger.error("translate%s error: %s", (text, from_lang, to_lang), e)
    else:
        _, params = cgi.parse_header(response.getheader('Content-Type', ''))
        print(content.decode(params['charset']))

您还可以ie/oe在 Google 服务的 url 中使用参数来指定input text/response content字符编码,如@Lennart Regebro 所说

于 2012-09-02T00:28:41.267 回答