如何在python3.0上对字符串进行编码,并在python2.7上正确解码

2024-06-26 13:45:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用Python编写一个在线多人游戏机。服务器使用Python3.0,客户端使用Python2.7(因为我想用我的智能手机,只能在上面找到Python2.7)。但是,我在服务器和客户机之间转换字符串编码时遇到了困难。在

我编写了两个函数sendDatareceiveData从套接字连接发送和接收字符串。问题是,当我在服务器端用'utf-8'对字符串你好进行编码并在客户端对其进行解码时,我在客户端遇到了以下错误:

UnicodeDecodeError: 'utf8' codec can't decode bytes in position 0-1: unexpected end of data

我尝试了encode('utf-8')两边,或者{}两边,但都没用。我也尝试过使用pickle,但客户端出现以下错误:

ValueError: unsupported pickle protocol: 3

那么我应该如何对字符串进行编码和解码呢?在

这是我的服务器代码(Python3.0,数据传输.py)公司名称:

def sendData(sock, data):
    '''
    Send string through socket.
    '''
    sock.send(struct.pack('Q', len(data)))
    sock.send(bytes(data.encode('utf-8'))) # This might be the cause of the error

def receiveData(sock):
    '''
    Receive object from socket.
    '''
    lengthLeft = struct.unpack('Q', sock.recv(struct.calcsize('Q')))[0]
    data = bytes()
    while lengthLeft > 0:
        block = sock.recv(lengthLeft)
        data += block
        lengthLeft -= len(block)
    return str(data)

服务器(Python 3.0)的主脚本:

^{pr2}$

我为客户机编写的代码是这样的,sendData和{}有一点变化(python2.7):

# -*- coding: UTF-8 -*-
import socket
import struct

def sendData(sock, data):
    '''
    Send string through socket.
    '''
    sock.send(struct.pack('Q', len(data)))
    sock.send(data)

def receiveData(sock):
    '''
    Receive object from socket.
    '''
    lengthLeft = struct.unpack('Q', sock.recv(struct.calcsize('Q')))[0]
    data = ''
    while lengthLeft > 0:
        block = sock.recv(lengthLeft)
        data += block
        lengthLeft -= len(block)
    return data.decode('utf-8') # Error comes from here

while True:
    try:
        ip = raw_input('Sever IP:')
        port = int(raw_input('Port:'))

        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect((ip, port))
    except socket.error as error:
        print('Error while connecting')
        print(error)
        print('')
    else:
        break

while True:
    print(receiveData(s))

另外,我想知道在将用户输入的字符串从客户机发送到服务器时应该怎么做,这样服务器就不会抱怨编码错误了?Python2.7在不同的系统上使用不同的编码,所以我现在不知道如何处理它。谢谢!在


Tags: 字符串服务器客户端编码datadefsocketblock
1条回答
网友
1楼 · 发布于 2024-06-26 13:45:50

你有一个问题,你的Python2程序一直在处理字节字符串(不是Unicode字符串),但是对于你试图解码的有效负载,你得到了错误。在

如果这是一个小的应用程序,也许只需跳过解码步骤,并编程您的客户端应用程序来处理utf-8编码的字节串。(但如果你必须处理文本,而不仅仅是获取输入并通过网络发送,那么这是不可行的)。在

现在,正如您所展示的,这不是unidodecode错误的来源-因为服务器正确地编码了数据,即使是双重编码,这个特定的错误也不会发生。在

在服务器端,您计算文本字符串的长度-pré-encoding,然后他们将其编码为UTF-8。例如,每个类中的utf字符最多为4个字符。在

所以,你做一个有效负载,宣布你有一个长度为“2”的字符串,它们传输8个字节——文本解码器需要其中4个字节来实际转换回字符。在

重写这个:

def sendData(sock, data):
    '''
    Send string through socket.
    '''
    sock.send(struct.pack('Q', len(data)))
    sock.send(bytes(data.encode('utf-8'))) 

为此:

^{pr2}$

你应该消除这个主要的错误。在

另外,服务器站点接收器函数上的最后一行不能是: return str(data)-改为return data.decode('utf-8')。在

相关问题 更多 >