Python: Utilisation de .format () sur une chaîne d'échappement Unicode

156

J'utilise Python 2.6.5. Mon code nécessite l'utilisation du signe "supérieur ou égal à". Et voilà:

>>> s = u'\u2265'
>>> print s
>>> 
>>> print "{0}".format(s)
Traceback (most recent call last):
     File "<input>", line 1, in <module> 
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2265'
  in position 0: ordinal not in range(128)`  

Pourquoi ai-je cette erreur? Y a-t-il une bonne façon de procéder? J'ai besoin d'utiliser la .format()fonction.

Trousse
la source

Réponses:

243

Faites simplement de la deuxième chaîne une chaîne unicode

>>> s = u'\u2265'
>>> print s

>>> print "{0}".format(s)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2265' in position 0: ordinal not in range(128)
>>> print u"{0}".format(s)
≥
>>> 
Scientifique fou
la source
40
@Kit: Si vous voulez que tous les littéraux soient Unicode (comme dans Python 3), placez-les from __future__ import unicode_literalsau début de vos fichiers source.
Philipp
1
Ouais, cela vous obtiendra si vous êtes habitué au% formatage car ce "% s"% u "\ u2265" fonctionne, mais "{}". Format (u "\ u2265") lèvera une exception.
Hylidan
2
quelle chose simple .. quel terrible mal de tête j'ai eu jusqu'à ce que je trouve ce peu d'illumination ..
Iosu S.
70

unicodes ont besoin de unicodechaînes de format.

>>> print u'{0}'.format(s)
Ignacio Vazquez-Abrams
la source
5

Un peu plus d'informations sur pourquoi cela se produit.

>>> s = u'\u2265'
>>> print s

fonctionne car printutilise automatiquement le codage système de votre environnement, qui était probablement défini sur UTF-8. (Vous pouvez vérifier en faisant import sys; print sys.stdout.encoding)

>>> print "{0}".format(s)

échoue car il formatessaie de faire correspondre le codage du type sur lequel il est appelé (je n'ai pas trouvé de documentation à ce sujet, mais c'est le comportement que j'ai remarqué). Étant donné que les littéraux de chaîne sont des chaînes d'octets codées en ASCII en python 2, formatessaie de coder sen ASCII, ce qui entraîne cette exception. Observer:

>>> s = u'\u2265'
>>> s.encode('ascii')
Traceback (most recent call last):
  File "<input>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2265' in position 0: ordinal not in range(128)

C'est donc essentiellement pourquoi ces approches fonctionnent:

>>> s = u'\u2265'
>>> print u'{}'.format(s)

>>> print '{}'.format(s.encode('utf-8'))

Le jeu de caractères source est défini par la déclaration de codage; c'est ASCII si aucune déclaration d'encodage n'est donnée dans le fichier source ( https://docs.python.org/2/reference/lexical_analysis.html#string-literals )

lps
la source
1
Oh , et je trouve que cela est d' une grande aide dans la compréhension unicode en python, et la représentation de texte dans les systèmes informatiques en général: nedbatchelder.com/text/unipain.html
lps