如何修复UnicodeDecodeError

时间:2019-01-17 13:31:44

标签: python audio encoding websocket base64

我正在编写一个asyncio web-sockets应用。我有客户端和服务器正在交换json格式的数据。有时,作为对客户端的响应,服务器返回音频数据。我将这些数据编码为base64,然后解码为utf-8。但是,当我发送带有音频数据的json时,网络套接字客户端无法解码该数据并引发“ UnicodeDecodeError”

这就是我从服务器发送数据的方式


. . . 

# audio_data is binary data from ".wav" file
response = {
    'status': 'success', 
    'data': base64.b64encode(audio_data).decode('UTF-8')
}
# send data throught socket
await websocket.send(json.dumps(response))

. . .

接收发送数据的代码(这是我收到的错误)


. . .

# Receive data from web-socket server
response = await websocket.recv()

. . .

我收到的错误

Traceback (most recent call last):
  File ".../env/lib/python3.6/site-packages/websockets/protocol.py", line 674, in transfer_data
    message = yield from self.read_message()
  File ".../env/lib/python3.6/site-packages/websockets/protocol.py", line 757, in read_message
    return frame.data.decode('utf-8') if text else frame.data
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xf0 in position 51872: invalid continuation byte

1 个答案:

答案 0 :(得分:1)

您的框架很可能希望您输出bytes,因此:

await wbsocket.send(json.dumps(...).encode(...))

尼特夫妇:

    由于base64的字符集受限制,
  • b64encode可以使用“ ascii”以及“ utf-8”进行解码
  • json.dumps默认情况下转义unicode,因此.encode("utf-8").encode("ascii")应该产生相同的结果
  • websockets文档未指定输入期望和输出产生str还是bytes ...