Le contenu de cet article concerne le problème de l'analyse par Python des octets anormaux du flux de données Socket (détails). Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.
Lorsque python envoie des données via socket, les caractères anglais sont échappés et convertis en leurs caractères d'origine, qui occupent un octet (par exemple : s est transféré vers s), tandis que les caractères chinois nécessitent deux caractères après avoir été échappés. pour identifier un caractère chinois (par exemple : bell est x92x9f après échappement). Il n'y a pas de problème du côté de l'envoi, mais le problème se produit principalement sur le client socket. Parce que lorsque le client accepte le flux de données, il y a une limite d'octets pour chaque acceptation, et un caractère chinois sera accepté deux fois, ce qui entraînera le signalement d'une UnicodeDecodeError à chaque fois que le flux accepté est échappé dans un caractère.
Actuellement, il existe un flux de données :
bmsg = b'\xe5\x88\x86\n\xe9\x92\x9f' # 分\n钟
Normalement accepté et échappé comme :
smsg = str(bmsg, 'utf-8') #方式一 或 smsg = bmsg.decode() # 方式二 第一参数默认utf8,第二参数默认strict,还有 ignore (忽略)、 replace (替代=?)
Si le flux de données reçu maintenant est
bmsg = b'\xe5\x88\x86\n\xe9\x92' # \x9f 作为下次接受
Comment éviter la sortie anormale du programme ? Deux méthodes de traitement :
1) Traitement de la perte de données
À ce moment, si le flux d'octets est échappé en utilisant la méthode d'acceptation normale, une exception UnicodeDecodeError se produira. Afin de ne pas signaler l'exception, nous utilisons la méthode. lors de l'échappement 2. Spécifiez le deuxième paramètre comme ignorer, comme suit :
smsg = bmsg.decode('utf-8', 'ignore') # 输出: 分\n ,如果为 replace 则 \n 后为 ?
2) Divisez le flux de données puis traitez-le
Généralement, le serveur socket se trouve lors de l'envoi de données, chaque flux de données est complet et sera envoyé avec la fin d'un caractère spécifique (tel que : n). Sur la base de la situation actuelle, chaque fois que nous recevons des données, nous les divisons selon ce caractère spécifique dans une liste qui enregistre un seul flux de données. Le premier flux de la liste peut être incomplet, alors fusionnez-le avec le dernier flux accepté dans un flux de données complet et échappez-le ; le flux du milieu est un flux de données qui peut être échappé normalement, le dernier flux est également incomplet, alors enregistrez-le ; , utilisé pour diviser le flux accepté la prochaine fois et répéter l'opération ci-dessus. Cela garantit que le programme ne se terminera pas anormalement et que l'intégrité des données est assurée. Le code approximatif est le suivant :
Acceptation des données :
La première fois qu'il accepte msg1 = b'xe5x88x86nxe9' # L'horloge est divisée en xe9 et x92x9f
La deuxième fois qu'il accepte msg2 = b'x92x9f_stonen'
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
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!