Envoi de l'UTF-8 avec les sockets
Je suis tring à l'installation d'un petit programme de chat en python. Tout fonctionnait bien, jusqu'à ce que je
envoyé une chaîne de caractères contenant un non ascii caractère qui a causé la panne du programme. La chaîne sont lues à partir d'un wx.TestCtrl
-
Comment puis-je envoyer une chaîne de caractères avec l'encodage UTF-8 sur les sockets?
-
Pourquoi le programme fonctionne sans problèmes au début? J'ai mis le codage UTF-8
donc ne pas tous les caractères causer la panne du programme?
Voici l'erreur:
Traceback (most recent call last):
File "./client.py", line 180, in sendMess
outSock.sendto(s,self.serveraddr)
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf6' in position 26:
ordinal not in range(128)
Voici comment j'ai créer le socket et essayez d'envoyer le message:
outSock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
....
outSock.sendto(s,self.serveraddr)
- stackoverflow.com/questions/1644640/...
- Merci! Donc, il n'y a pas moyen d'envoyer la chaîne sans les décoder?
- Vous n'avez pas de décoder les envoyer, vous encodez - vous de prendre vos chaînes unicode (qui ne sont pas en UTF-8, ou au moins ne pas le faire), de les convertir en octets, et d'envoyer les octets. Voir aussi nedbatchelder.com/text/unipain.html pour plus d'informations de fond.
- Les données que vous envoyez sur le socket est juste un flux d'octets, le socket ne sais pas ou les soins de ce qu'il est. C'est au récepteur de décoder les données d'une manière significative.
Vous devez vous connecter pour publier un commentaire.
En Python 2,
socket.sendto
sur un socket prend une "plaine" de la chaîne, pas ununicode
objet. Par conséquent, vous devez coder, par exemple l'utilisation de l'UTF-8:De même, lorsque vous
recvfrom
(ou similaire) à l'autre extrémité, vous aurez besoin de revenir à un objet Unicode:(En Python 3, vous allez travailler avec
bytes
, ce qui rend le besoin pour convertir entre elle etunicode
plus explicite.)s.decode('utf-8')
va exploser tous sur vous si vous lui donnez un partiel de l'UTF-8 de la séquence. Généralement, vous pouvez utiliser les flux plutôt que des datagrammes pour cela, donc vous savez quand vous avez un message entier (ou peut-être vous mettre en place quelque chose de similaire dans des datagrammes, ou de limiter la longueur des messages afin de fragmentation n'est pas un risque ou quelque chose).