UnicodeEncodeError: Der Codec 'ascii' kann das Zeichen u '\ u2013' in Position 3 nicht codieren. 2: Ordnungszahl nicht im Bereich (128)

75

Ich analysiere eine xsl-Datei mit xlrd. Die meisten Dinge funktionieren gut. Ich habe ein Wörterbuch, in dem Schlüssel Zeichenfolgen und Werte Listen von Zeichenfolgen sind. Alle Schlüssel und Werte sind Unicode. Ich kann die meisten Schlüssel und Werte mit der str()Methode drucken . Einige Werte haben jedoch das Unicode-Zeichen - \u2013für das ich den obigen Fehler erhalte.

Ich vermute, dass dies geschieht, weil dies ein in Unicode eingebetteter Unicode ist und der Python-Interpreter ihn nicht dekodieren kann. Wie kann ich diesen Fehler beseitigen?

Danke im Voraus.

Sumod
quelle

Antworten:

78

Sie können auch Unicode-Objekte drucken, Sie müssen str () nicht darum herum ausführen.

Angenommen, Sie möchten wirklich eine str:

Wenn Sie str (u '\ u2013') ausführen, versuchen Sie, die Unicode-Zeichenfolge in eine 8-Bit-Zeichenfolge zu konvertieren. Dazu müssen Sie eine Codierung verwenden, eine Zuordnung zwischen Unicode-Daten zu 8-Bit-Daten. Str () verwendet die Standardcodierung des Systems, die unter Python 2 ASCII ist. ASCII enthält nur die 127 ersten Codepunkte von Unicode, dh \ u0000 bis \ u007F1. Das Ergebnis ist, dass Sie den obigen Fehler erhalten, der ASCII-Codec weiß einfach nicht, was \ u2013 ist (es ist übrigens ein langer Strich).

Sie müssen daher angeben, welche Codierung Sie verwenden möchten. Übliche sind ISO-8859-1, am häufigsten als Latin-1 bekannt, das die 256 ersten Codepunkte enthält; UTF-8, das alle Codepunkte mithilfe der Codierung mit variabler Länge codieren kann, CP1252, das unter Windows üblich ist, und verschiedene chinesische und japanische Codierungen.

Sie verwenden sie wie folgt:

u'\u2013'.encode('utf8')

Das Ergebnis ist ein Str, der eine Folge von Bytes enthält, die die uTF8-Darstellung des betreffenden Zeichens darstellt:

'\xe2\x80\x93'

Und Sie können es ausdrucken:

>>> print '\xe2\x80\x93'
Lennart Regebro
quelle
Das war sehr umfassend. Vielen Dank. Ich hatte eine Frage - Sagen wir, Twitter-Stream, Sie würden die Codierung nicht im Voraus kennen. Wie würden Sie damit umgehen?
Karthikr
@karthikr: Es fällt mir schwer zu glauben, dass Twitter die Codierung nicht bereitstellt.
Lennart Regebro
29

Sie können dies auch versuchen, um den Text zu erhalten.

foo.encode('ascii', 'ignore')
Pritesh Desai
quelle
1
Nach vielen SO-Suchen wurde dies für mich behoben. Meine besondere Verwendung war in einem Druck, da sowohl Windows als auch Linux diesen Codierungsfehler auslösten.
ddisqq
Dadurch gehen Daten für Nicht-ASCII verloren. Die richtige Methode besteht darin, mit der richtigen Codierung zu codieren.
Padraic Cunningham
Dadurch wird das Nicht-ASCII-Zeichen ignoriert. Ihre Antwort ist nur, das Problem zu ignorieren?
John Strood
Wenn Sie keine Nicht-ASCII-Zeichen verwenden, dann ja.
Pritesh Desai
Warum eine Zeichenfolge "foo" nennen?
Ghosh
7

Da hier str(u'\u2013')Fehler verursacht werden, verwenden isinstance(foo,basestring)Sie diese Option, um nach Unicode / String zu suchen. Wenn dies nicht vom Typ Base String ist, konvertieren Sie ihn in Unicode und wenden Sie dann Codierung an

if isinstance(foo,basestring):
    foo.encode('utf8')
else:
    unicode(foo).encode('utf8')

weiter lesen

Vaseem Ahmed Khan
quelle
Warum eine Zeichenfolge "foo" nennen?
Ghosh
5

Ich hatte das gleiche Problem. Das funktioniert gut für mich:

str(objdata).encode('utf-8')
Mohsen
quelle
2

Ich hatte genau dieses Problem in einem kürzlich durchgeführten Projekt, das wirklich sehr schmerzhaft ist. Ich habe endlich herausgefunden, dass der Python, den wir in Docker verwendet haben, die Codierung "ansi_x3.4-1968" anstelle von "utf-8" hat. Wenn also jemand da draußen Docker verwendet und diesen Fehler hat, kann das Befolgen dieser Schritte Ihr Problem gründlich lösen.

  1. Erstellen Sie eine Datei und nennen Sie sie default_locale im selben Verzeichnis Ihrer Docker- Datei. Fügen Sie diese Zeile ein.

    Umwelt = LANG = "es_ES.utf8", LC_ALL = "es_ES.UTF-8", LC_LANG = "es_ES.UTF-8"

  2. füge diese zu deiner Docker-Datei hinzu,

    RUN apt-get clean && apt-get update && apt-get install -y Gebietsschemas

    RUN locale-gen en_CA.UTF-8

    COPY ./default_locale / etc / default / locale

    RUN chmod 0755 / etc / default / locale

    ENV LC_ALL = en_CA.UTF-8

    ENV LANG = en_CA.UTF-8

    ENV LANGUAGE = en_CA.UTF-8

Dies hat mein Problem gründlich gelöst, als ich meinen Docker erstellt und erneut ausgeführt habe. Hoffentlich löst dies auch Ihr Problem.

Chris
quelle
0

bei mir funktioniert das

Unicode (Daten) .encode ('utf-8')

Ulv3r
quelle