我正在尝试使用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'}
答案 0 :(得分:1)
您正在使用1.x版本的Socket.IO客户端,其中known problems具有UTF-8字符串的双重编码。您应该尝试解决此问题的2.x版本。
答案 1 :(得分:0)
我似乎正在使用latin-1
取回mojibake并使用utf-8
进行编码。
为了解决这个问题,我补充道:
json_str = json_str.encode('latin-1').decode('utf-8')
如果您遇到此问题,请查看Miguel's answer。
答案 2 :(得分:0)
我通过添加反向代理路径末尾的socket.io.js来使用反向代理服务器的socket.io js文件,例如xxx.com/reverse_proxy_path/socket.io