return x
e l s e :
return unicode ( x ) . encode ( ’ utf −8 ’ )
2. M´
elanger str et unicode (Python 2.x uniquement)
def p r i n t r e s u l t ( r ) :
print u”R´
e s u l t a t : ” +str (r)
Cette fonction pr´
esente deux points de danger : premi`
erement, l’op´
erateur + op´
er´
e
entre un str et un unicode, qui entraˆ
ıne une conversion implicite du str en unicode.
Si par malheur, str (r) renvoie une chaˆ
ıne d’octets contenant des octets de valeur
num´
erique sup´
erieure `
a 127, une erreur serait lanc´
ee :
UnicodeDecodeError : ’ a s c i i ’ codec can ’ t decode byte 0 xc3 in
p o s i t i o n 0 : o r di n al not i n range ( 1 2 8 )
Deuxi`
emement, l’erreur inverse risque de se produire si l’encodage de la chaˆ
ıne
Unicode demand´
e implicitement par print ´
echoue (souvent parce que l’encodage
de la sortie standard n’est pas connu ou est plus restrictif que n´
ecessaire) :
UnicodeEncodeError : ’ a s c i i ’ codec can ’ t encode c h a r a c t e r u ’ \
xe9 ’ i n p o s i t i o n 0 : o r d in a l not i n range ( 1 2 8 )
Ces probl`
emes sont r´
esolus en Python 3.x, o `
u aucune conversion entre bytes et str
n’est faite implicitement. On a donc une erreur lorsqu’on essaie par exemple de
concat´
ener une chaˆ
ıne d’octets et une chaˆ
ıne de caract`
eres Unicode, quel que soit le
contenu des chaˆ
ınes.
2.2 Quelques conseils
1. Fichiers texte
En Python 2.x, on peut manipuler des fichiers texte `
a l’aide du module codecs qui
permet de sp´
ecifier un codage lors de l’ouverture du fichier :
import codecs
with codecs .open (” t o t o . t x t ” ,”w” , encoding=” u tf −8” )as f :
f . w ri te ( u”Enchant \u00e9 . \n” )
Attention cependant, en utilisant le module codecs, on perd la conversion automa-
tique des fins de ligne.
En Python 3.x, la fonction open dispose d’un argument encoding qui permet d’uti-
liser directement ce que permettait codecs.open en Python 2.x. On peut ´
egalement
noter que les retours `
a la ligne peuvent ˆ
etre convertis automatiquement, contraire-
ment aux fichiers ouverts avec le module codecs.
with open (” t o t o . t x t ” ,”w” , encoding=” u tf −8” )as f :
f . wr it e ( ” Enchant\u00e9 . \n” )
5