Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

conversion de chaîne de caractères

11 réponses
Avatar
val
Bonjour,

Je suis en train de m'emmêler lamentablement les pinceaux sur un
problème de codage de string après avoir récupéré des données d'un
fichier excel avec win32com.client.

Dans une fonction j'ai ça :

rawtext=u''
val=xlWb.ActiveSheet.Cells(row,col).Value
rawtext=rawtext+repr(val.encode("iso-8859-1" ))
print rawtext

Et a un moment je l'écris dans un fichier :
save_file.write(rawtext)

Et je retrouve des caractères /xe9 et /xe8 à la place de é et è dans la
console et mon fichier.

Le contexte c'est python 2.6 sur XP
je ne sais pas si ça compte mais
un locale.getlocale() me donne (None, None)

Comment faire pour trouver quel est le code (standard?) du fichier xls
et le communiquer à python pour que les caractères s'inscrivent
correctement dans le fichier ?

1 réponse

1 2
Avatar
val
Francois Lafont a écrit le 28/06/2011 :
Le 28/06/2011 01:00, Francois Lafont a écrit :

rawtext=rawtext+val.encode('cp1252')



Normal que ça plante ici. val est de l'unicode et rawtext aussi. Ils
sont de même type. Donc il n'y a rien à faire à part simplement :

rawtext = rawtext + val



Pour être précis, le val.encode('cp1252') n'a aucun sens pour moi car
rawtext est de l'unicode et val aussi donc on peut/doit les additionner
directement. C'est ça qu'il faut retenir.

Ceci étant dit, ce n'est pas le val.encode('cp1252') qui provoque une
erreur ici. L'instruction val.encode('cp1252') toute seule est
parfaitement licite et elle renvoie un str encodé en cp1252. Mais comme
tu additionnes un unicode (rawtext) avec un str (val.encode('cp1252')),
il va chercher à convertir le str en unicode et en fait :

ton « rawtext = rawtext + val.encode('cp1252') » revient en fait à ça :

rawtext = rawtext + val.encode('cp1252').decode('ascii')

(conversion implicite du str en unicode, mais par défaut Python part du
principe que le str est en ascii.)

Et là boum ! Erreur puisque que le str val.encode('cp1252') n'est pas
100% ASCII.



Effectivement si je fais rawtext=rawtext+val tout marche impec.

Merci pour cette explication.
1 2