You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Flask与Socket.IO实现双向通信时接收UTF-8字符串乱码问题

解决Flask-SocketIO接收UTF-8字符串乱码问题

这个问题我之前做实时通信项目时也踩过坑,结合你描述的现象(服务端发消息正常、客户端发前能正确打印,唯独服务端收消息乱码),大概率是编码解码的匹配性出了问题,给你几个针对性的排查和解决方法:

1. 先确认客户端的发送姿势是否正确

SocketIO默认会帮我们处理UTF-8编码,所以别画蛇添足手动转码:

  • 如果是JavaScript客户端:直接发送原生字符串,不要用TextEncoder转成ArrayBuffer,也不要手动转成Blob。正确示例:
    socket.emit('chat_message', '这是包含中文/特殊字符的UTF-8文本');
    
  • 如果是Python客户端:确保发送的是str类型,不是bytes。比如别发b'测试内容',直接传字符串即可。

2. 服务端接收时做类型判断与解码

有时候客户端可能不小心发送了字节流,这时候服务端需要手动解码成UTF-8字符串。在你的事件处理函数里加个判断:

@socket_io.on('chat_message')
def handle_chat(data):
    # 先打印数据类型,快速定位问题
    print(f"接收数据类型:{type(data)}")
    # 如果是bytes类型,强制用UTF-8解码
    if isinstance(data, bytes):
        data = data.decode('utf-8')
    print(f"解码后消息:{data}")
    # 后续业务逻辑...

3. 初始化SocketIO时指定编码参数

可以在创建SocketIO实例的时候明确指定编码,避免默认配置的潜在问题:

socket_io = SocketIO(app, charset='utf-8', encoding='utf-8')

4. 排查JSON序列化的坑

如果你们是通过JSON格式传递数据,要确保两端的序列化/反序列化逻辑一致:

  • 客户端(JS):用JSON.stringify()序列化对象,直接发送字符串即可
    socket.emit('json_data', JSON.stringify({content: 'UTF-8测试内容'}));
    
  • 服务端(Python):先把接收的字符串解析成JSON对象,再读取内容

@socket_io.on('json_data')
def handle_json(data):
if isinstance(data, str):
data = json.loads(data)
print(f"JSON内容:{data['content']}")

## 快速排查小技巧
在服务端接收数据的第一行打印`type(data)`和`repr(data)`,能帮你快速判断是字节流乱码还是字符串编码不匹配:
```python
print(f"数据类型:{type(data)},原始内容:{repr(data)}")

比如如果输出是数据类型:<class 'bytes'>,原始内容:b'\xe4\xbd\xa0\xe5\xa5\xbd',那就是没解码;如果是字符串但乱码,可能客户端用了GBK之类的其他编码发送,这时候要让客户端改成UTF-8。

内容的提问来源于stack exchange,提问作者Božo Stojković

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:07:03