python在经由过程socket发送数据时,英文字符转义后为本来自身的字符,占一个字节(如:s转移后为s),而中文字符在转义后须要二个字节来标识一个中文字符(如:钟转义后为\x92\x9f)。在发送端是不存在题目的,而发作题目的主假如在socket客户端。由于客户端在接收数据流时,每次接收都是有字节限定,就会涌现一个中文字符分两次接收,从而致使每次接收的流在转义成字符时报错UnicodeDecodeError。
当前有数据流:
bmsg = b'\xe5\x88\x86\n\xe9\x92\x9f' # 分\n钟
平常接收并转义为:
smsg = str(bmsg, 'utf-8') #体式格局一 或 smsg = bmsg.decode() # 体式格局二 第一参数默许utf8,第二参数默许strict,另有 ignore (疏忽)、 replace (替换=?)
假如如今接收到的数据流为
bmsg = b'\xe5\x88\x86\n\xe9\x92' # \x9f 作为下次接收
怎样防止顺序的非常退出,有两种处置惩罚体式格局:
1)数据丧失处置惩罚
此时,假如再用平常接收体式格局转义bytes流,就会涌现 UnicodeDecodeError 非常,为使不报非常,我们在转义时,经由过程体式格局二,指定第二个参数为 ignore,以下:
smsg = bmsg.decode('utf-8', 'ignore') # 输出: 分\n ,假如为 replace 则 \n 后为 ?
2)数据流拆分,再处置惩罚
平常socket服务端在发送数据时,每一个数据流是完全的,并会以特定的字符(如:\n)完毕一并发送。依据这类近况,我们在每次接收数据时,依据这个特定字符拆分(split)为一个保留单个数据流的列表。列表的第一个流可能为不完全,把它和上次接收的流合并为一个完全的数据流并转义;中心为能够平常转义的数据流;末了一个流也为不完全,保留下来,用来拼接下次接收的流,并反复上述操纵,如许保证了顺序不会非常退出,也保证数据的完全性。大抵代码以下:
数据接收状况:
第一次接收 msg1 = b'\xe5\x88\x86\n\xe9' ; # 钟 被拆分红 \xe9 和 \x92\x9f
第二次接收 msg2 = b'\x92\x9f_stone\n'
init_msg = b'' # 初始化流 while True: msg = soc.recv(128) # 接收数据 init_msg += msg msg_arr = init_msg.split(b'\n') # 注重此处的 b'\n' ,由于被拆分的为bytes串,所以也要用bytes串来拆分 init_msg += msg_arr[-1] msg_arr.remove(msg_arr[-1]) for i in range(len(msg_arr)): string = msg_arr[i].decode('utf-8') print(string
以上就是Python剖析Socket数据流非常bytes的题目(细致)的细致内容,更多请关注ki4网别的相干文章!