0

看来我在需要传递 Bing 翻译垃圾的地方遇到了编码本身的问题。

def _unicode_urlencode(params):
    if isinstance(params, dict):
        params = params.items()
    return urllib.urlencode([(k, isinstance(v, unicode) and v.encode('utf-8') or v) for k, v in params])

def _run_query(args):
        data = _unicode_urlencode(args)
        sock = urllib.urlopen(api_url + '?' + data)
        result = sock.read()
        if result.startswith(codecs.BOM_UTF8):
                result = result.lstrip(codecs.BOM_UTF8).decode('utf-8')
        elif result.startswith(codecs.BOM_UTF16_LE):
                result = result.lstrip(codecs.BOM_UTF16_LE).decode('utf-16-le')
        elif result.startswith(codecs.BOM_UTF16_BE):
                result = result.lstrip(codecs.BOM_UTF16_BE).decode('utf-16-be')
        return json.loads(result)

def set_app_id(new_app_id):
        global app_id
        app_id = new_app_id

def translate(text, source, target, html=False):
        """
        action=opensearch
        """
        if not app_id:
                raise ValueError("AppId needs to be set by set_app_id")
        query_args = {
                'appId': app_id,
                'text': text,
                'from': source,
                'to': target,
                'contentType': 'text/plain' if not html else 'text/html',
                'category': 'general'
        }
        return _run_query(query_args)
...
text = translate(sys.argv[2], 'en', 'tr')
HOST = '127.0.0.1'
PORT = 894
s = socket.socket()
s.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
s.connect((HOST, PORT))
s.send("Bing translation: " + text.encode('utf8') + "\r");
s.close()

如您所见,如果翻译后的文本包含一些土耳其语字符,则脚本无法将文本发送到套接字。

您对如何摆脱这种情况有任何想法吗?

问候。

4

2 回答 2

2

您的问题与套接字完全无关。text已经是一个字节串,并且您正在尝试对其进行编码。发生的情况是 Python 尝试通过安全的 ASCII 编码将字节串转换为 unicode,以便能够编码为 UTF-8,然后由于字节串包含非 ASCII 字符而失败。

您应该通过使用返回 unicode 对象的 JSON 变量来修复translate返回unicode对象。

或者,如果它已经对编码为 UTF-8 的文本进行编码,则可以简单地使用

s.send("Bing translation: " + text + "\r")
于 2013-07-04T23:53:48.337 回答
-1
# -*- coding:utf-8 -*-

 text = u"text in you language"
 s.send(u"Bing translation: " + text.encode('utf8') + u"\r");

这必须有效。text必须以 utf-8 编码拼写。

于 2013-07-04T23:34:46.690 回答