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

树莓派TCP服务器:Python3接收数据乱码,Python2正常,求解码方法

解决Python3 TCP接收数据解码异常的问题

看起来你遇到的问题核心是Python2和Python3对socket数据的处理差异,以及解码编码选择不当导致的乱码。我来帮你拆解一下原因和解决方案:

问题根源

Python2中socket.recv()直接返回str类型(本质是字节串),终端会默认按ASCII或系统编码解析显示;但Python3里recv()返回的是bytes对象,必须显式解码为str,如果用默认的UTF-8解码,对于ASCII控制字符(比如十进制20对应的DC4、21对应的NAK这类不可打印字符),就会出现解码异常或显示乱码(比如你看到的@4、@5)。

针对性解决方案

根据你的场景,我推荐以下几种处理方式:

1. 使用Latin-1编码解码(最适配单字节场景)

Latin-1是单字节到Unicode的一一映射编码,任何字节值(0-255)都能被正确解码为对应的Unicode字符,不会出现乱码。修改你的代码如下:

import socket
host = '192.168.1.100'
port = 25000
mySocket = socket.socket()
mySocket.connect((host,port))
data = mySocket.recv(4).decode('latin-1')  # 指定latin-1编码
print(data)
# 如果想查看字符的真实编码表示,可以用repr()
print(repr(data))

这样十进制20的字节0x14会被解码为Unicode字符U+0014,用repr()会显示为'\x14',避免终端的异常显示。

2. 直接处理二进制字节(如果需要数值而非字符)

如果你发送的是十进制数值对应的字节(比如字节0x14代表数值20),而不是字符,那完全不需要解码,直接操作bytes对象即可:

import socket
host = '192.168.1.100'
port = 25000
mySocket = socket.socket()
mySocket.connect((host,port))
data_bytes = mySocket.recv(4)
# 遍历每个字节,输出十进制数值
for byte in data_bytes:
    print(f"收到数值: {byte}")

这种方式能直接获取你发送的十进制数值,完全绕开字符解码的问题,适合传输二进制数据的场景。

3. 确认服务器端的发送编码

如果树莓派服务器是按特定编码(比如ASCII)发送字符数据,也可以直接指定ascii编码解码,但注意ASCII只支持0-127的字节值,超出范围会报错;而Latin-1支持0-255,兼容性更强。

补充说明

Python2之所以没问题,是因为它的字符串系统没有严格区分字节和字符,而Python3强制区分bytes和str,这是更严谨的设计,但也要求我们明确编码方式。选对编码后,就能和Python2一样正常接收数据了。

内容的提问来源于stack exchange,提问作者Ra S

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:33:39