首页 > 解决方案 > 如何修复 UnicodeDecodeError

问题描述

我正在编写一个asyncio web-sockets应用程序。我有我的客户端和服务器以 json 格式交换数据。有时作为对客户端的响应,服务器返回音频数据。我将该数据编码为base64并解码为utf-8。但是当我发送带有音频数据的 json 时,web-socket 客户端无法解码该数据并引发“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

标签: pythonaudioencodingwebsocketbase64

解决方案


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

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

尼特夫妇:

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

推荐阅读