Ada masalah yang signifikan dengan beberapa jawaban yang diposting sejauh ini: diterjemahkan unicode()
dari pengodean default, yang seringkali ASCII; sebenarnya, unicode()
mencoba membuat "rasa" dari byte yang diberikan dengan mengubahnya menjadi karakter. Dengan demikian, kode berikut, yang pada dasarnya adalah apa yang direkomendasikan oleh jawaban sebelumnya, gagal pada mesin saya:
# -*- coding: utf-8 -*-
author = 'éric'
print '{0}'.format(unicode(author))
memberi:
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)
Kegagalan berasal dari fakta bahwa author
tidak hanya mengandung byte ASCII (yaitu dengan nilai dalam [0; 127]), dan unicode()
menerjemahkan dari ASCII secara default (pada banyak mesin).
Solusi yang kuat adalah dengan secara eksplisit memberikan pengkodean yang digunakan di bidang Anda; menggunakan UTF-8 sebagai contoh:
u'{0} in {1}'.format(unicode(self.author, 'utf-8'), unicode(self.publication, 'utf-8'))
(atau tanpa inisial u
, tergantung pada apakah Anda menginginkan hasil Unicode atau string byte).
Pada titik ini, orang mungkin ingin mempertimbangkan memiliki author
dan publication
bidang menjadi string Unicode, alih-alih mendekode mereka selama memformat.
'{} in {}'
string format biasa .