Cher Internet,
Je suis sur le point de sortir un truc génial en python, mais un dernier bug me gène: J'utilise, parceque ca me lourde me faire chier a réinventer la roue, SocketServer.StreamRequestHandler. Ca marche bien, sauf que a un moment, pour renvoyer les réponses a mes clients, je fais un self.wfile.writelines(truc). Et la, quand on lui file de l'UTF-8 dans truc, ca fait mal:
File "/usr/lib/python2.4/socket.py", line 253, in writelines self._wbuf.extend(filter(None, map(str, list))) UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 14: ordinal not in range(128)
Ca marche si j'utilise des bidouilles genre sitecustomize.py, mais yaurait pas une vraie solution qui ne m'oblige pas à ré-ecrire un truc qui marche tres bien a part ce petit détail?
Edit: Bon, solution pourrie mais qui marche: remplacer writelines par une boucle sur la liste avec un write de chaque element + un encode('UTF-8') sur chaque. Mais ca me plait pas du tout...








Commentaires
encode()/decode() avec le charset approprié ça passe pas ?
Ce qui est rigolo c'est que sys.getdefaultencoding() marche sans probleme chez moi mais que python veux pas entendre parler de sys.setdefaultencoding.
Ça me semble assez normal. Fais ça en C et tu vas voir comme il va te jeter comme un malpropre :D. Enregistre ton fichier en ascii (encodage 8859-1), ça devrait aller mieux... Surtout que même si ça passait, tu risquerait des problèmes d'alignement assez foudroyants (puisqu'un octet n'est plus forcément un caractère)...
Ceci dit, si tu es certain de ton truc, à mon avis c'est juste qu'il vérifie si le most significant bit est bien à 0 (bref, 7 bits utiles), donc tu n'as plus qu'à trouver l'endroit où il fait un masque de bit par exemple (recherche la string de l'erreur dans le fichier, il doit y avoir un joli 'if' avec). Parce que dans l'absolu, il est impossible de différencier un encodage d'un autre, ce n'est qu'un tas de bit (le 8ème bit indique si l'octet suivant est une extension du caractère, ce qui permet de coder au maximum sur 14 bits).
Marmoute: oui, c'est expliqué dans diveintopython justement. Le seul moyen de faire ce sys.setdefaultencoding() est d'etre dans sitecustomize.py
L'encodage de mon fichier n'a rien a voir, truc est une chaine que je recupere d'autre part en unicode, si je mets mon fichier en utf-8 ainsi que mon terminal, je n'ai aucun mal a l'afficher. Et je peux /veux pas aller trifouiller dans les méandres de python pour savoir ou il fait ca, je pense que c'est tout a fait normal comme erreur, je sais juste pas trop quoi trifouiller pour que ca marche.
Palpatine: je ne suis pas en C
David est certainement proche de la solution. Le probleme, c'est de savoir quel encode/decode faire, et ou. Ma chaine est deja en unicode, j'ai deja essayé un map avec une fonction bidon faisant encode('UTF-8') de ce qu'elle recoit - truc est une liste, d'ou le writelines - et toujours rien.
Bon, quoi que je fasse sur la liste ca ne marchait pas, writelines() est bizarre. une boucle sur la liste, avec un write() et un str.encode('utf-8'), ca marche.