Проблемы с получением UTF-8 от клиента

Я пытаюсь создать двустороннюю связь между сервером и клиентом, используя Flask а также socket.io,

Все работает нормально, пока сервер не получит utf-8 строка от клиента, которая искажается. Отправка с сервера на клиент работает нормально, и перед отправкой с клиента на сервер клиент печатает сообщение правильно.

Вот некоторый код, который воспроизводит проблему:

app.py:

import flask
from flask_socketio import SocketIO, emit, disconnect

import json

app = flask.Flask(__name__)
socket_io = SocketIO(app)

@socket_io.on('pull')
def socket_io_handle_pull():
    json_msg = {
        'msg': "abcćčddžđefghijklmnnjoprsštuvzž"
    }
    print("Pushing", json_msg)

    socket_io.emit('response', json_msg)

@socket_io.on('push')
def socket_io_handle_push(json_msg):
    print("Pushed:", json_msg)

@socket_io.on('disconnect')
def socket_io_handle_disconnect():
    disconnect()

@app.route('/')
def root():
    return flask.render_template(
        'index.html'
    )

if __name__ == '__main__':
    socket_io.run(app)

index.html:

<!DOCTYPE html>
<html>
  <head>
    <script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/socket.io/1.3.6/socket.io.min.js"></script>
  </head>
  <body>
    <script type="text/javascript">
      var socket = io.connect('http://' + document.domain + ':' + location.port);

      socket.on('response', json => {
        socket.emit('push', json);
      })

      socket.emit('pull');
    </script>
  </body>
</html>

Выход:

Pushing {'msg': 'abcćčddžđefghijklmnnjoprsštuvzž'}
Pushed: {'msg': 'abcÄ\x87Ä\x8dddA3Ä\x91efghijklmnnjoprsA!tuvzA3'}

2 ответа

Решение

Вы используете версии 1.x клиента Socket.IO, у которого были известные проблемы с двойным кодированием строк UTF-8. Вы должны попробовать версии 2.x, которые решили эту проблему.

Я использовал файл socket.io js из обратного прокси-сервера, добавив в конец socket.io.js путь обратного прокси-сервера, например, xxx.com/reverse_proxy_path/socket.io

Кажется, я получал обратно декодированный с помощью моджибаке latin-1 и закодированы с utf-8,

Чтобы это исправить, я добавил:

json_str = json_str.encode('latin-1').decode('utf-8')

Если у вас возникла эта проблема, взгляните на ответ Мигеля.

Другие вопросы по тегам