Hay un problema importante con algunas de las respuestas publicadas hasta ahora: unicode()
decodifica desde la codificación predeterminada, que a menudo es ASCII; de hecho, unicode()
trata de dar "sentido" a los bytes que se le dan al convertirlos en caracteres. Por lo tanto, el siguiente código, que es esencialmente lo que recomiendan las respuestas anteriores, falla en mi máquina:
# -*- coding: utf-8 -*-
author = 'éric'
print '{0}'.format(unicode(author))
da:
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)
La falla proviene del hecho de que author
no contiene solo bytes ASCII (es decir, con valores en [0; 127]), y unicode()
decodifica desde ASCII por defecto (en muchas máquinas).
Una solución robusta es dar explícitamente la codificación utilizada en sus campos; tomando UTF-8 como ejemplo:
u'{0} in {1}'.format(unicode(self.author, 'utf-8'), unicode(self.publication, 'utf-8'))
(o sin la inicial u
, dependiendo de si desea un resultado Unicode o una cadena de bytes).
En este punto, uno podría considerar tener los campos author
y publication
como cadenas Unicode, en lugar de decodificarlos durante el formateo.
'{} in {}'
cadena de formato plano .