2012-08-30 78 views
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是土耳其字符的有效編碼。 我能做些什麼來解決這個問題?你知道,它不僅適用於土耳其語。在python3中使用http和urllib模塊時,非ascii字符

示例;

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

谷歌可能不會使用cp1254發送文本。網頁的字符編碼與您的終端使用的編碼無關。 http://en.wikipedia.org/wiki/Character_encodings_in_HTML – jfs

+0

'content =「text/html; charset = UTF-8」' down down utf8 is toocessful,too – frukoprof

回答

0

仔細看看這個,你有一堆錯誤和不正確的假設。 Like

「順便說一句,CP1254是土耳其字符的有效編碼。」

是的,的確如此,但還有其他的,如ISO 8859-9,這不僅是Microsoft使用的實際國際標準。當然,UTF-8/16/32。

此外,您不僅僅使用CP1254而不檢查是否真的是Google使用的解碼(不是),您不需要發送正確編碼中的單詞。我在第一次閱讀時忽略了這一點,因爲你的問題集中在你回來的東西上。直到第二次閱讀,我意識到你的主要問題實際上是翻譯失敗,當你有一個非ascii字符。

您也正在發送一個字符(?)並返回兩個字符,這就是爲什麼我認爲它是UTF8是問題的原因,它是,但不是我第一次想到的。

由於您通過HTTP GET發送它,因此您必須對URL中的文本進行編碼,這意味着您基本上必須使用UTF-8。但你的GET沒有這樣說。您的請求中沒有任何內容表示您使用的是UTF-8。現在,您應該設置一些讀者來執行此操作,但這很複雜,Google翻譯允許您作弊。你可以傳入ie參數,說明你有什麼編碼。

如果你不這樣做,它可能會回落到ISO-8859-1,這在這些情況下是標準的。這將需要您發送的兩個字節爲»,並假定它們是兩個不同的字符,這就是爲什麼您會返回兩個字符。

最後,您應該查看標題以查看Google用於響應的編碼。但在這裏你也可以作弊,並告知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') 

它會工作。

+0

_Google will not send back to you using cp1254_那麼,我怎樣才能看到土耳其人的性格當我得到迴應?在第一個例子「搶劫dövüşü」有一個土耳其字符,並沒有被取代? – frukoprof

+0

我嘗試了所有的時間。如果你是這個意思, 'res = conn.getresponse()。read()。decode(「utf-8」,'replace')'then look response:'[[[「s z」,「söz」,「」,「」 ]] ,, 「TR」 ,, [[ 「S」,[5],1,0,999,0,1,0],[ 「」,[6],1,0,999,1,2,0] ,[ 「z」 的,[7],1,0,999,2,3,0]],[[ 「S」,5,[[ 「S」,999,1,0],[「拼寫」 0,1,0]],[[0,2]], 「SOZ」],[ 「」,6,[[ 「」,999,1,0]],[[2,1 3] 「」],[ 「z」 的,如圖7所示,[[ 「z」 的,999,1,0],[ 「我們的」,0,1,0],[ 「C」,0,1,0 ],[「Z」,0,1,0]],[[3,4]],「」]] ,,, [[「tr」]],19]';它會帶來更糟糕的結果。 – frukoprof

+0

@frukoprof:你說得對,還有更多的問題。答案已更新。您應該嘗試閱讀您正在使用的API的文檔。 –

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參數指定input text/response content字符編碼爲@Lennart Regebro said