C'è un problema significativo con alcune delle risposte pubblicate finora: unicode()
decodifica dalla codifica predefinita, che spesso è ASCII; infatti, unicode()
cerca di dare un "senso" ai byte che viene dato convertendoli in caratteri. Pertanto, il seguente codice, che è essenzialmente ciò che è raccomandato dalle risposte precedenti, non riesce sulla mia macchina:
# -*- coding: utf-8 -*-
author = 'éric'
print '{0}'.format(unicode(author))
dà:
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'errore deriva dal fatto che author
non contiene solo byte ASCII (ovvero con valori in [0; 127]) e unicode()
decodifica da ASCII per impostazione predefinita (su molte macchine).
Una soluzione affidabile è quella di fornire esplicitamente la codifica utilizzata nei campi; prendendo UTF-8 come esempio:
u'{0} in {1}'.format(unicode(self.author, 'utf-8'), unicode(self.publication, 'utf-8'))
(o senza l'iniziale u
, a seconda che si desideri un risultato Unicode o una stringa di byte).
A questo punto, si potrebbe voler considerare di avere i campi author
e publication
come stringhe Unicode, invece di decodificarli durante la formattazione.
'{} in {}'
stringa di formato normale .