Il y a un problème important avec certaines des réponses publiées jusqu'à présent: unicode()
décode à partir de l'encodage par défaut, qui est souvent ASCII; en fait, unicode()
essaie de donner un «sens» aux octets qui lui sont donnés en les convertissant en caractères. 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'il author
ne contient pas que des octets ASCII (c'est-à-dire avec des valeurs entre [0; 127]), et unicode()
décode de l'ASCII par défaut (sur de nombreuses machines).
Une solution robuste est de donner explicitement l'encodage utilisé dans vos champs; en prenant UTF-8 comme exemple:
u'{0} in {1}'.format(unicode(self.author, 'utf-8'), unicode(self.publication, 'utf-8'))
(ou sans l'initiale u
, selon que vous voulez un résultat Unicode ou une chaîne d'octets).
À ce stade, vous pouvez envisager de faire en sorte que les champs author
et publication
soient des chaînes Unicode, au lieu de les décoder lors du formatage.
'{} in {}'
chaîne de format simple .