OVH Cloud OVH Cloud

StringIO et encodage

3 réponses
Avatar
Bertrand B
Bonjour,
Bon je s=E8che ...

J'utilise le module StringIO
f=3DStringIO()
si la premi=E8re cha=EEne que j'=E9cris par f.write() comporte un accent =
c'est ok.
Si j'=E9cris en premier une cha=EEne sans accent par f.write() et lors d'=
un=20
f.write suivant j'ai une erreur (unicde error etc ..) si j'ai un accent=20
dans la cha=EEne.

Comment peut on forcer StrinGIO =E0 fonctionner en latin-1 et pas en asci=
i ?


Question annexe la m=E9thode get du widget Text de Tkinter retourne quel =

encodage ?

3 réponses

Avatar
Mickaël Delahaye

Bonjour,
Bon je sèche ...

J'utilise le module StringIO
f=StringIO()
si la première chaîne que j'écris par f.write() comporte un accent c'est ok.
Si j'écris en premier une chaîne sans accent par f.write() et lors d' un
f.write suivant j'ai une erreur (unicde error etc ..) si j'ai un accent
dans la chaîne.

Comment peut on forcer StrinGIO à fonctionner en latin-1 et pas en asci i ?


Question annexe la méthode get du widget Text de Tkinter retourne quel
encodage ?


Encore un problème de codage...

StringIO ignore totalement l'encodage... Tu peux toujours faire

s = StringIO()
s.write('sans accent')
s.write('ou avec éèàù')

Là les chaines envoyés sont des chaines normales... mais si tu lui
envoie des chaînes Unicode (c'est à dire un autre type d'objet!!) il
va tenter une conversion, et par défaut c'est de l'Ascii :
# coding: iso-8859-1 au début du fichier
s.write(u"éé")
--> UnicodeEncodeError: 'ascii' codec can't encode u'xe9' etc..

Une solution possible encoder toit même la chaine Unicode en latin1
par exemple
s.write(u"éé".encode('latin1'))

Cordialement,
Mickaël Delahaye

Avatar
Laurent Pointal
Mickaël Delahaye wrote:


Bonjour,
Bon je sèche ...

J'utilise le module StringIO
f=StringIO()
si la première chaîne que j'écris par f.write() comporte un accent c'est
ok. Si j'écris en premier une chaîne sans accent par f.write() et lors
d'un f.write suivant j'ai une erreur (unicde error etc ..) si j'ai un
accent dans la chaîne.

Comment peut on forcer StrinGIO à fonctionner en latin-1 et pas en ascii
?


Question annexe la méthode get du widget Text de Tkinter retourne quel
encodage ?


Encore un problème de codage...

StringIO ignore totalement l'encodage... Tu peux toujours faire

s = StringIO()
s.write('sans accent')
s.write('ou avec éèàù')

Là les chaines envoyés sont des chaines normales... mais si tu lui
envoie des chaînes Unicode (c'est à dire un autre type d'objet!!) il
va tenter une conversion, et par défaut c'est de l'Ascii :
# coding: iso-8859-1 au début du fichier
s.write(u"éé")
--> UnicodeEncodeError: 'ascii' codec can't encode u'xe9' etc..

Une solution possible encoder toit même la chaine Unicode en latin1
par exemple
s.write(u"éé".encode('latin1'))


Il y a une classe wrapper spécifique codecs.EncodedFile pour rendre ça
transparent, (noter aussi, dans le même module, une fonction open pour
rendre transparent l'encodage d'un vrai fichier - mais là elle ne
s'applique pas vu que l'on ne manipule pas un vrai fichier).

A+

Laurent.


Avatar
Bertrand B

Bonjour,
Bon je sèche ...

J'utilise le module StringIO
f=StringIO()
si la première chaîne que j'écris par f.write() comporte un acce nt c'est ok.
Si j'écris en premier une chaîne sans accent par f.write() et lors d'un
f.write suivant j'ai une erreur (unicde error etc ..) si j'ai un accen t
dans la chaîne.

Comment peut on forcer StrinGIO à fonctionner en latin-1 et pas en a scii ?


Question annexe la méthode get du widget Text de Tkinter retourne qu el
encodage ?


Encore un problème de codage...

StringIO ignore totalement l'encodage... Tu peux toujours faire

s = StringIO()
s.write('sans accent')
s.write('ou avec éèàù')

Là les chaines envoyés sont des chaines normales... mais si tu lui
envoie des chaînes Unicode (c'est à dire un autre type d'objet!!) i l
va tenter une conversion, et par défaut c'est de l'Ascii :
# coding: iso-8859-1 au début du fichier
s.write(u"éé")
--> UnicodeEncodeError: 'ascii' codec can't encode u'xe9' etc..

Une solution possible encoder toit même la chaine Unicode en latin1
par exemple
s.write(u"éé".encode('latin1'))

Cordialement,
Mickaël Delahaye

Si je vous lit bien le message :

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe9 in position 34:
ordinal not in range(128)
M'indique donc que le widget Text de tkinter retourne de l'unicode ...


Je viens de tester et effectivement l'ajout de .encode('latin1') à
chaque chaîne renvoyée par tkinter a solutionné le problème

Thx !