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。

また、それが実際に Google が使用するデコードであるかどうかを確認せずに CP1254 を使用しているだけでなく (そうではありません)、正しいエンコードで単語を送信していません。あなたの質問はあなたが何を返すかに焦点を当てているので、最初に読んだときにそれを見逃しました。あなたの主な問題は、非ASCII文字を使用しているときに翻訳が失敗することです。

また、1 文字を送信して 2 文字を返しているため、UTF8 が問題だと思いましたが、そうではありませんでした。

HTTP GET で送信するため、URL 内のテキストをエンコードする必要があり、基本的に UTF-8 を使用する必要があります。しかし、あなたの GET はそれを言いません。UTF-8 を使用しているという要求には何もありません。さて、実際にはこれを行うリーダーを設定する必要がありますが、それは複雑であり、Google 翻訳を使用するとごまかすことができます。ieあなたが持っているエンコーディングを言って、パラメータを渡すことができます。

そうしないと、これらの場合の標準である ISO-8859-1 にフォールバックする可能性があります。これは、あなたが送信した 2 バイトを受け取り、それらが 2 つの異なる文字であると想定します。これが、2 つの文字が返される理由です。

最後に、ヘッダーを見て、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)

(真剣に、すべてを1つの長い行に貼り付ける必要はありません)

そして変更:

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']))

@Lennart Regebro が言っie/oeたように、Google サービスの URL でパラメータを使用してinput text/response content文字エンコーディングを指定することもできます。

于 2012-09-02T00:28:41.267 に答える