2

Google Translate API を使用して、カンナダ語 (したがってエンコードされた utf-16) のテキストを英語に翻訳しようとしています。URL を手動で入力し、Google API キーhttps://www.googleapis.com/language/translate/v2?key=key#&q =ಚಿಂಚೋಳಿ&source=kn&target=en をプラグインした後、私が欲しい翻訳。

ただし、問題は、この URL が utf16 でエンコードされていることです。urllib を使用して url を開こうとすると、以下のエラー メッセージが表示されます。続行する方法または続行する別の方法についてのアドバイスをいただければ幸いです。

編集: text が utf16 テキストである urllib.parse.quote_plus(text) を呼び出し、utf16 テキストをその関数からの戻り値に置き換えることで問題を解決できると思います。

Traceback (most recent call last):
  File "<pyshell#19>", line 1, in <module>
    urllib.request.urlopen(url)
  File "/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/urllib/request.py", line 156, in urlopen
    return opener.open(url, data, timeout)
  File "/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/urllib/request.py", line 469, in open
    response = self._open(req, data)
  File "/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/urllib/request.py", line 487, in _open
    '_open', req)
  File "/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/urllib/request.py", line 447, in _call_chain
    result = func(*args)
  File "/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/urllib/request.py", line 1283, in https_open
    context=self._context, check_hostname=self._check_hostname)
  File "/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/urllib/request.py", line 1248, in do_open
    h.request(req.get_method(), req.selector, req.data, headers)
  File "/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/http/client.py", line 1061, in request
    self._send_request(method, url, body, headers)
  File "/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/http/client.py", line 1089, in _send_request
    self.putrequest(method, url, **skips)
  File "/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/http/client.py", line 953, in putrequest
    self._output(request.encode('ascii'))
UnicodeEncodeError: 'ascii' codec can't encode characters in position 73-79: ordinal not in range(128)
4

1 に答える 1

2

ただし、問題は、この URL が utf16 でエンコードされていることです。

UTF-16 は、あなたが思っているような意味ではありません。これは、Win32 API などの一部のシステムの文字列型によって内部的に使用されるバイトへの Unicode 文字のエンコーディングです。UTF-16 は ASCII と互換性がないため、Web で使用されることはほとんどありません。

https://www.googleapis.com/language/translate/v2?key=key#&q=ಚಿಂಚೋಳಿ&amp;source=kn&target=en

これは URI ではありません。URI には ASCII 文字のみを含めることができます。これはIRIであり、他の Unicode 文字を含めることができます。

ただしurllib、IRI はサポートしていません。IRI を直接サポートする Python ライブラリがいくつかあります。あるいは、任意の IRI を対応する URI に変換することもできますurllib。これは、IDNA アルゴリズムを使用してホスト名の非 ASCII 文字をエンコードし、文字の UTF-8 表現での URL エンコードを使用して、アドレスの他の部分 (クエリ パラメーターを含む) の非 ASCII 文字をエンコードすることによって行われます。 . これにより、次のようになります。

https://www.googleapis.com/language/translate/v2?key=key#&q=%E0%B2%9A%E0%B2%BF%E0%B2%82%E0%B2%9A%E0%B3%8B%E0%B2%B3%E0%B2%BF&source=kn&target=en

ただし、#ここでの使用は正しくないように見えます。これは、ブラウザーからデータを渡すためのクライアント側のメカニズムであり、サーバー要求では機能しません。

通常、次のようにします。

baseurl= 'https://www.googleapis.com/language/translate/v2'
text= u'ಚಿಂಚೋಳಿ'
url= baseurl+'?'+urllib.urlencode(dict(
    source= 'kn', target= 'en',
    q= text.encode('utf-8'),
    key= key
))
于 2013-05-21T11:02:06.393 に答える