web-dev-qa-db-fra.com

À quoi sert unicode_literals?

J'ai un problème bizarre avec __future__.unicode_literals en Python. Sans importer unicode_literals J'obtiens la sortie correcte:

# encoding: utf-8
# from __future__ import unicode_literals
name = 'helló wörld from example'
print name

Mais quand j'ajoute le unicode_literals importation:

# encoding: utf-8
from __future__ import unicode_literals
name = 'helló wörld from example'
print name

J'ai eu cette erreur:

UnicodeEncodeError: 'ascii' codec can't encode character u'\xf3' in position 4: ordinal not in range(128)

Est-ce que unicode_literals encoder chaque chaîne en utf-8? Que dois-je faire pour remplacer cette erreur?

36
ssj

Votre terminal ou console ne parvient pas à laisser Python savoir qu'il prend en charge UTF-8.

Sans le from __future__ import unicode_literals ligne, vous créez une chaîne d'octets qui contient des octets encodés en UTF-8. Avec la chaîne, vous créez une chaîne unicode.

print doit traiter ces deux valeurs différemment; une chaîne d'octets est écrite dans sys.stdout inchangé. Une chaîne unicode est d'abord codée en octets et Python consulte sys.stdout.encoding pour ça. Si votre système ne dit pas correctement Python quel codec il prend en charge, la valeur par défaut est d'utiliser ASCII.

Votre système n'a pas pu indiquer Python quel codec utiliser; sys.stdout.encoding est défini sur ASCII et le codage de la valeur unicode à imprimer a échoué.

Vous pouvez le vérifier en encodant manuellement en UTF-8 lors de l'impression:

# encoding: utf-8
from __future__ import unicode_literals
name = 'helló wörld from example'
print name.encode('utf8')

et vous pouvez reproduire le problème en créant des littéraux unicode sans le from __future__ instruction d'importation aussi:

# encoding: utf-8
name = u'helló wörld from example'
print name

u'..' est également un littéral unicode.

Sans détails sur votre environnement, il est difficile de dire quelle est la solution; cela dépend beaucoup du système d'exploitation et de la console ou du terminal utilisé.

46
Martijn Pieters