Il y a un sérieux problème avec certaines des réponses postées jusqu'à présent: unicode()
décode de l'encodage par défaut, qui est souvent ASCII; en fait, unicode()
tente de faire du "sens" les octets qu'il est donné par la conversion en personnages. Ainsi, le code suivant, qui est essentiellement ce qui est recommandé par les réponses précédentes, échoue sur ma machine:
# -*- coding: utf-8 -*-
author = 'éric'
print '{0}'.format(unicode(author))
donne:
Traceback (most recent call last):
File "test.py", line 3, in <module>
print '{0}'.format(unicode(author))
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128)
L'échec vient du fait qu' author
ne contient pas uniquement les octets ASCII (c'est à dire à valeurs dans [0; 127]), et unicode()
décode du ASCII par défaut (sur la plupart des machines).
Une solution robuste est de donner explicitement l'encodage utilisé dans vos champs; la prise en UTF-8 comme exemple:
u'{0} in {1}'.format(unicode(self.author, 'utf-8'), unicode(self.publication, 'utf-8'))
(ou sans le u
, selon que vous souhaitez une Unicode résultat ou une chaîne d'octets).
À ce stade, on peut vouloir envisager d'avoir l' author
et publication
des champs de chaînes Unicode, au lieu de les décoder pendant le formatage.