Python: Verwenden von .format () für eine Zeichenfolge mit Unicode-Escapezeichen


156

Ich benutze Python 2.6.5. Mein Code erfordert die Verwendung des Zeichens "mehr als oder gleich". Hier kommt's:

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

Warum erhalte ich diesen Fehler? Gibt es einen richtigen Weg, dies zu tun? Ich muss die .format()Funktion verwenden.

Antworten:


243

Machen Sie einfach die zweite Zeichenfolge auch zu einer Unicode-Zeichenfolge

>>> 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: Wenn alle Literale Unicode sein sollen (wie in Python 3), setzen Sie sie from __future__ import unicode_literalsan den Anfang Ihrer Quelldateien.
Philipp

1
Ja, dies wird Ihnen helfen, wenn Sie an% Formatierung gewöhnt sind, da dieses "% s"% u "\ u2265" funktioniert, aber "{}". Format (u "\ u2265") eine Ausnahme auslöst.
Hylidan

2
Was für eine einfache Sache. Was für schreckliche Kopfschmerzen bekam ich, bis ich dieses Stück Erleuchtung fand.
Iosu S.


5

Ein bisschen mehr Informationen darüber, warum das passiert.

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

funktioniert, weil printautomatisch die Systemcodierung für Ihre Umgebung verwendet wird, die wahrscheinlich auf UTF-8 eingestellt war. (Sie können überprüfen, indem Sie tun import sys; print sys.stdout.encoding)

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

schlägt fehl, weil formatversucht wird, die Codierung des aufgerufenen Typs abzugleichen (ich konnte keine Dokumentation dazu finden, aber dies ist das Verhalten, das ich bemerkt habe). Da String-Literale Byte-Strings sind, die in Python 2 als ASCII codiert sind, wird formatversucht, sals ASCII zu codieren , was dann zu dieser Ausnahme führt. Beobachten:

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

Deshalb funktionieren diese Ansätze im Grunde:

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

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

Der Quellzeichensatz wird durch die Codierungsdeklaration definiert. Es ist ASCII, wenn in der Quelldatei keine Codierungsdeklaration angegeben ist ( https://docs.python.org/2/reference/lexical_analysis.html#string-literals ).


1
Oh, und ich fand, dass dies eine große Hilfe beim Verständnis von Unicode in Python und der Textdarstellung in Computersystemen im Allgemeinen ist: nedbatchelder.com/text/unipain.html
lps
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.