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.

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)
≥
>>> 

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.


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 )


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.