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?
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
où 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é.