Как исправить UnicodeDecodeError - PullRequest
0 голосов
/ 17 января 2019

Я пишу 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 голосов
/ 18 января 2019

Скорее всего, ваш фреймворк ожидает от вас вывода bytes, таким образом:

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

Пара гнид:

  • b64encode может быть декодирован как "ascii", так и "utf-8" из-за ограниченного набора символов base64
  • json.dumps по умолчанию экранирует юникод, поэтому .encode("utf-8") и .encode("ascii") должны давать одинаковый результат
  • websockets в документах не указывается, ожидает ли ввод, а вывод производит str или bytes ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...