Asyncio和pyzmq - 'utf-8'编解码器无法解码位置0的字节0xff

时间:2018-01-29 00:38:47

标签: python utf-8 python-asyncio pyzmq

我有一个let closure1 = { (a:String) in print(a)} let closure2 = closure1 if closure1 as AnyObject === closure2 as AnyObject { print("success") } ,这是TCP Doc的一个例子。但是我使用asyncio server连接到它,当服务器上的阅读器尝试读取时,我得到一个解码错误。任何提示都受到高度赞赏。我已经尝试过首先编码到utf-8,没有帮助。

服务器:(Python 3.6)

pyzmq

客户端:(Python 2.7)

import asyncio

async def handle_echo(reader, writer):
    data = await reader.read(100)
    print(data)
    message = data.decode()


loop = asyncio.get_event_loop()
coro = asyncio.start_server(handle_echo, '127.0.0.1', 5555, loop=loop)
server = loop.run_until_complete(coro)
loop.run_forever()

完整跟踪:

import zmq
context = zmq.Context()
socket = context.socket(zmq.REQ)
socket.connect ("tcp://localhost:%s" % 5555)
socket.send("test")

2 个答案:

答案 0 :(得分:4)

Zeromq使用ZMTP protocol。它是一个二进制协议,因此您无法直接解码它。

如果您对此感到好奇,请使用wireshark和ZMTP plugin检查ZMTP帧:

Wireshark + ZMTP

您可以看到您获得的字节实际上与问候留言签名相对应。

要从asyncio中的ZMQ套接字接收消息,请使用aiozmq之类的专用项目:

import aiozmq
import asyncio

async def main(port=5555):
    bind = "tcp://*:%s" % port
    rep = await aiozmq.create_zmq_stream(aiozmq.zmq.REP, bind=bind)
    message, = await rep.read()
    print(message.decode())
    rep.write([message])

if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main())
    loop.close()

答案 1 :(得分:3)

字节ff是小端UTF-16 BOM的第一个字节,它在UTF-8流中没有位置,其中代码点开头的最大1位数是4。

有关UTF-8编码的详细信息,请参阅earlier answer of mine

至于修复它,你需要接收发送的内容。这将涉及固定发送端进行UTF-8,或接收侧进行UTF-16。

您可能希望了解Python 2和3中字符串之间的差异,这可能是导致您出现问题的原因(请参阅here)。