Python: utilizzo di .format () su una stringa con escape Unicode


156

Sto usando Python 2.6.5. Il mio codice richiede l'uso del segno "più o uguale a". Eccolo:

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

Perché visualizzo questo errore? C'è un modo giusto per farlo? Devo usare la .format()funzione.

Risposte:


243

Basta rendere la seconda stringa anche una stringa 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: se vuoi che tutti i letterali siano Unicode (come in Python 3), metti from __future__ import unicode_literalsall'inizio dei tuoi file sorgente.
Philipp,

1
Sì, questo ti aiuterà se sei abituato alla formattazione% poiché questo "% s"% u "\ u2265" funziona, ma "{}". Format (u "\ u2265") genererà un'eccezione.
Hylidan,

2
che cosa semplice .. che terribile mal di testa ho avuto fino a quando non ho trovato questo po 'di illuminazione ..
Iosu S.


5

Un po 'più di informazioni sul perché ciò accada.

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

funziona perché printutilizza automaticamente la codifica di sistema per il tuo ambiente, che probabilmente era impostata su UTF-8. (Puoi controllare facendo import sys; print sys.stdout.encoding)

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

fallisce perché formatcerca di abbinare la codifica del tipo su cui è chiamata (non sono riuscito a trovare documentazione su questo, ma questo è il comportamento che ho notato). Poiché i valori letterali di stringa sono stringhe di byte codificate come ASCII in Python 2, formattenta di codificare scome ASCII, il che si traduce quindi in tale eccezione. Osservare:

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

Ecco perché fondamentalmente funzionano questi approcci:

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

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

Il set di caratteri di origine è definito dalla dichiarazione di codifica; è ASCII se non viene fornita alcuna dichiarazione di codifica nel file sorgente ( https://docs.python.org/2/reference/lexical_analysis.html#string-literals )


1
Oh, e ho scoperto che questo è di grande aiuto per la comprensione dell'unicode in Python e la rappresentazione del testo nei sistemi informatici in generale: nedbatchelder.com/text/unipain.html
lps
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.