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
失败!
答案 0 :(得分:0)
仔细观察这一点,你会遇到一堆错误和错误的假设。喜欢
“顺便说一下,CP1254是土耳其字符的有效编码。”
是的,这是真的,但还有其他的,如ISO 8859-9,这是一个不仅被微软使用的实际国际标准。当然还有UTF-8/16 / 32.
此外,您不仅在使用CP1254而不检查是否真的是谷歌使用的解码(它不是),您也不会以正确的编码发送这个词。我在第一次阅读时错过了,因为你的问题集中在你得到的东西上。直到第二次阅读我才意识到你的主要问题实际上是当你有一个非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')
它会起作用。
答案 1 :(得分: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']))
您还可以在Google服务的网址中使用ie/oe
参数,将input text/response content
个字符编码指定为@Lennart Regebro said。