UnicodeDecodeError:“ utf-8”编解码器无法解码位置65535中的字节0xd9:数据意外结束

时间:2019-09-13 05:56:37

标签: python sockets unicode encoding utf-8

当我使用时:

print(bytes(my_string,'utf-8').decode('utf-8'))

一切都很好,我可以看到我的琴弦。

但是当我将my_string发送到另一台计算机时,请使用以下命令:

conn.send(bytes(my_string,'utf-8'))

并在另一台机器上接收它,但是当我想对其进行解码时,出现以下错误:

print(recv_data.decode('utf-8'))

  File "./multiconn-client.py", line 86, in service_connection
    print(recv_data.decode('utf-8'))
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd9 in position 65535: unexpected end of data

当我不使用编码进行打印时:

print(recv_data)

我看到一个文本,但是它不在我的编码中。

如何解决?

更新:

我的服务器:

   conn.send(bytes(my_string,'utf-8'))  
   conn.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, sys.getsizeof(my_string))

注意:当我在服务器上打印my_string时,一切正常。

我将选择器模块用于多个连接。

在客户端中,我使用:

def service_connection(key, mask):
sock = key.fileobj
data = key.data
if mask & selectors.EVENT_READ:
    buff = sock.getsockopt(SOL_SOCKET,SO_RCVBUF)
    recv_data = sock.recv(1024 | buff)
    if recv_data:
        buff = sock.getsockopt(SOL_SOCKET,SO_RCVBUF)
        print('In cli getsizeof of recv_data:',sys.getsizeof(recv_data))
        recv_data += recv_data
        data.recv_total += len(recv_data)
        print(recv_data.decode('utf-8')) #######error line is here.

现在我只收到decode函数的以下错误:

Traceback (most recent call last):
  File "./multiconn-client.py", line 122, in <module>
    service_connection(key, mask)
  File "./multiconn-client.py", line 99, in service_connection
    print(recv_data.decode('utf-8'))
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd9 in position 65535: invalid continuation byte

注意:当我使用不带print(recv_data)功能的decode时,它将打印我的unicde数据,例如:

b'm01,2,130,12_18,\xd9\x88\xd9\x8e\xd9\x85\xd9\x8e\xd9\x86 \xd9\x8a\xd9\x8e\xd8\xb1\xd9\x92\xd8\xba\xd9\x8e\xd8\xa8\xd9\x8f \xd8\xb9\xd9\x8e\xd9\x86 \xd9\x85\xd9\x91\xd9\x90\xd9\x84\xd9\x91\xd9\x8e\xd8\xa9\xd9\x90 \xd8\xa5\xd9\x90\xd8\xa8\xd9\x92\xd8\xb1\xd9\x8e\xd9\xb0\xd9\x87\xd9\x90\xdb\xa6\xd9\x85\xd9\x8e \xd8\xa5\xd9\x90\xd9\x84\xd9\x91\xd9\x8e\xd8\xa7 \xd9\x85\xd9\x8e\xd9\x86 \xd8\xb3\xd9\x8e\xd9\x81\xd9\x90\xd9\x87\xd9\x8e \xd9\x86\xd9\x8e\xd9\x81\xd9\x92\xd8\xb3\xd9\x8e\xd9\x87\xd9\x8f\xdb\xa5 \xd9\x88\xd9\x8e\xd9\x84\xd9\x8e\xd9\x82\xd9\x8e\xd8\xaf\xd9\x90 \xd9\xb1\xd8\xb5\xd9\x92\xd8\xb7\xd9\x8e\xd9\x81\xd9\x8e\xd9\x8a\xd9\x92\xd9\x86\xd9\x8e\xd9\xb0\xd9\x87\xd9\x8f \xd9\x81\xd9\x90\xd9\x89 \xd9\xb1\xd9\x84\xd8\xaf\xd9\x91\xd9\x8f\xd9\x86\xd9\x92\xd9\x8a\xd9\x8e\xd8\xa7 \xd9\x88\xd9\x8e\xd8\xa5\xd9\x90\xd9\x86\xd9\x91\xd9\x8e\xd9\x87\xd9\x8f\xdb\xa5 \xd9\x81\xd9\x90\xd9\x89 \xd9\xb1\xd9\x84\xd9\x92\xd8\xa1\xd9\x8e\xd8\xa7\xd8\xae\xd9\x90\xd8\xb1\xd9\x8e\xd8\xa9\xd9\x90 \xd9\x84\xd9\x8e\xd9\x85\xd9\x90\xd9\x86\xd9\x8e \xd9\xb1\xd9\x84\xd8\xb5\xd9\x91\xd9\x8e\xd9\xb0\xd9\x84\xd9\x90\xd8\xad\xd9\x90\xd9\x8a\xd9\x86\xd9\x8e#m02,2,238,3_4,\xd8\xad\xd9\x8e\xd9\xb0\xd9\x81\xd9\x90\xd8\xb8\xd9\x8f\xd9\x88\xd8\xa7\xdb\x9f \xd8\xb9\xd9\x8e\xd9\x84\xd9\x8e\xd9\x89 \xd9\xb1\xd9\x84\xd8\xb5\xd9\x91\xd9\x8e\xd9\x84\xd9\x8e\xd9\x88\xd9\x8e\xd9\xb0\xd8\xaa\xd9\x90 \xd9\x88\xd9\x8e\xd9\xb1\xd9\x84\xd8\xb5\xd9\x91\xd9\x8e\xd9\x84\xd9\x8e\xd9\x88\xd9\xb0\xd8\xa9\xd9\x90 \xd9\xb1\xd9\x84\xd9\x92\xd9\x88\xd9\x8f\xd8\xb3\xd9\x92\xd8\xb7\xd9\x8e\xd9\x89\xd9\xb0 \xd9\x88\xd9\x8e\xd9\x82\xd9\x8f\xd9\x88\xd9\x85\xd9\x8f\xd9\x88\xd8\xa7\xdb\x9f \xd9\x84\xd9\x90\xd9\x84\xd9\x91\xd9\x8e\xd9\x87\xd9\x90 \xd9\x82\xd9\x8e\xd9\xb0\xd9\x86\xd9\x90\xd8\xaa\xd9\x90\xd9\x8a\xd9\x86\xd9\x8e#m03,2,277,5_7,\xd8\xa5\xd9\x90\xd9\x86\xd9\x91\xd9\x8e \xd9\xb1\xd9\x84\xd9\x91\xd9\x8e\xd8\xb0\xd9\x90\xd9\x8a\xd9\x86\xd9\x8e \xd8\xa1\xd9\x8e\xd8\xa7\xd9\x85\xd9\x8e\xd9\x86\xd9\x8f\xd9\x88\xd8\xa7\xdb\x9f \xd9\x88\xd9\x8e\xd8\xb9\xd9\x8e\xd9\x85\xd9\x90\xd9\x84\xd9\x8f\xd9\x88\xd8\xa7\xdb\x9f \xd9\xb1\xd9\x84\xd8\xb5\xd9\x91\xd9\x8e\xd9\xb0\xd9\x84\xd9\x90\xd8\xad\xd9\x8e\xd9\xb0\xd8\xaa\xd9\x90 \xd9\x88\xd9\x8e\xd8\xa3\xd9\x8e\xd9\x82\xd9\x8e\xd8\xa7\xd9\x85\xd9\x8f\xd9\x88\xd8\xa7\xdb\x9f \xd9\xb1\xd9\x84\xd8\xb5\xd9\x91\xd9\x8e\xd9\x84\xd9\x8e\xd9\x88\xd9\xb0\xd8\xa9\xd9\x8e \xd9\x88\xd9\x8e\xd8\xa1\xd9\x8e\xd8\xa7\xd8\xaa\xd9\x8e\xd9\x88\xd9\x8f\xd8\xa7\xdb\x9f \xd9\xb1\xd9\x84\xd8\xb2\xd9\x91\xd9\x8e\xd9\x83\xd9\x8e\xd9\x88\xd9\xb0\xd8\xa9\xd9\x8e \xd9\x84\xd9\x8e\xd9\x87\xd9\x8f\xd9\x85\xd9\x92 \xd8\xa3\xd9\x8e\xd8\xac\xd9\x92\xd8\xb1\xd9\x8f\xd9\x87\xd9\x8f\xd9\x85\xd9\x92 \xd8\xb9\xd9\x90\xd9\x86\xd8\xaf\xd9\x8e \xd8\xb1\xd9\x8e\xd8\xa8\xd9\x91\xd9\x90\xd9\x87\xd9\x90\xd9\x85\xd9\x92 \xd9\x88\xd9\x8e\xd9\x84\xd9\x8e\xd8\xa7 \xd8\xae\xd9\x8e\xd9\x88\xd9\x92\xd9\x81\xd9\x8c \xd8\xb9\xd9\x8e\xd9\x84\xd9\x8e\xd9\x8a\xd9\x92\xd9\x87\xd9\x90\xd9\x85\xd9\x92 \xd9\x88\xd9\x8e\xd9\x84\xd9\x8e\xd8\xa7 \xd9\x87\xd9\x8f\xd9\x85\xd9\x92 \xd9\x8a\xd9\x8e\xd8\xad\xd9\x92\xd8\xb2\xd9\x8e\xd9\x86\xd9\x8f\xd9\x88\xd9\x86\xd9\x8e#m04,3,39,5_20,\xd9\x81\xd9\x8e\xd9\x86\xd9\x8e\xd8\xa7\xd8\xaf\xd9\x8e\xd8\xaa\xd9\x92\xd9\x87\xd9\x8f \xd9\xb1\xd9\x84\xd9\x92\xd9\x85\xd9\x8e\xd9\x84\xd9\x8e\xd9\xb0\xd9\x93\xd8\xa6\xd9\x90\xd9\x83\xd9\x8e\xd8\xa9\xd9\x8f \xd9\x88\xd9\x8e\xd9\x87\xd9\x8f\xd9\x88\xd9\x8e \xd9\x82\xd9\x8e\xd8\xa7\xd9\x93\xd8\xa6\xd9\x90\xd9\x85\xd9\x8c \xd9\x8a\xd9\x8f\xd8\xb5\xd9\x8e\xd9\x84\xd9\x91\xd9\x90\xd9\x89 \xd9\x81\xd9\x90\xd9\x89 \xd9\xb1\xd9\x84\xd9\x92\xd9\x85\xd9\x90\xd8\xad\xd9\x92\xd8\xb1\xd9\x8e\xd8\xa7\xd8\xa8\xd9\x90 \xd8\xa3\xd9\x8e\xd9\x86\xd9\x91\xd9\x8e \xd9\xb1\xd9\x84\xd9\x84\xd9\x91\xd9\x8e\xd9\x87\xd9\x8e \xd9\x8a\xd9\x8f\xd8\xa8\xd9\x8e\xd8\xb4\xd9\x91\xd9\x90\xd8\xb1\xd9\x8f\xd9\x83\xd9\x8e \xd8\xa8\xd9\x90\xd9\x8a\xd9\x8e\xd8\xad\xd9\x92\xd9\x8a\xd9\x8e\xd9\x89\xd9\xb0 \xd9\x85\xd9\x8f\xd8\xb5\xd9\x8e\xd8\xaf\xd9\x91\xd9\x90\xd9\x82\xd9\x8b\xdb\xa2\xd8\xa7 \xd8\xa8\xd9\x90\xd9\x83\xd9\x8e\xd9\x84\xd9\x90\xd9\x85\xd9\x8e\xd8\xa9\xd9\x8d \xd9\x85\xd9\x91\xd9\x90\xd9\x86\xd9\x8e \xd9\xb1\xd9\x84\xd9\x84\xd9\x91\xd9\x8e\xd9\x87\xd9\x90 \xd9\x88\xd9\x8e\xd8\xb3\xd9\x8e\xd9\x8a\xd9\x91\xd9\x90\xd8\xaf\xd9\x8b\xd8\xa7 \xd9\x88\xd9\x8e\xd8\xad\xd9\x8e\xd8\xb5\xd9\x8f\xd9\x88\xd8\xb1\xd9\x8b\xd8\xa7 \xd9\x88\xd9\x8e\xd9\x86\xd9\x8e\xd8\xa8\xd9\x90\xd9\x8a\xd9\x91\xd9\x8b\xd8\xa7 \xd9\x85\xd9\x91\xd9\x90\xd9\x86\xd9\x8e \xd9\xb1\xd9\x84\xd8\xb5\xd9\x91\xd9\x8e\xd9\xb0\xd9\x84\xd9\x90\xd8\xad\xd9\x90\xd9\x8a\xd9\x86\xd9\x8e#m05,4,77,39_10,\xd8\xa3\xd9\x8

当我评论recv_data += recv_data行时,出现错误:

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd9 in position 65535: unexpected end of data

1 个答案:

答案 0 :(得分:3)

数字65535是一个大红色标记。

您是否注意到65535是2乘16的幂减去1? 64KiB中有65536个字节,我敢打赌,您的套接字连接不允许您一次发送超过64KiB的数据。

尝试发送较小的数据集,看看是否有相同的问题。如果是这样,则需要弄清楚如何以块的形式发送数据集,将它们放回接收端,然后对其进行解码。