Ich habe diese Zeichenfolge, die mit dem E-Mail-Modul von Quoted-printable nach ISO-8859-1 dekodiert wurde. Dies gibt mir Zeichenfolgen wie "\ xC4pple", die "Äpple" (Apple auf Schwedisch) entsprechen würden. Ich kann diese Zeichenfolgen jedoch nicht in UTF-8 konvertieren.
>>> apple = "\xC4pple"
>>> apple
'\xc4pple'
>>> apple.encode("UTF-8")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc4 in position 0: ordinal not in range(128)
Was soll ich machen?
python
character-encoding
Zyberzero
quelle
quelle
Dies ist ein häufiges Problem, daher hier eine relativ gründliche Darstellung.
Für Nicht-Unicode-Zeichenfolgen (dh solche ohne
u
Präfixu'\xc4pple'
) muss von der nativen Codierung (iso8859-1
/latin1
, sofern nicht mit der rätselhaftensys.setdefaultencoding
Funktion geändert ) zu dekodiertunicode
und dann in einen Zeichensatz codiert werden, der die gewünschten Zeichen anzeigen kann, in diesem Fall I. würde empfehlenUTF-8
.Hier ist zunächst eine praktische Dienstprogrammfunktion, mit deren Hilfe die Muster von Python 2.7-Zeichenfolgen und Unicode beleuchtet werden können:
Eine einfache Saite
Dekodieren einer iso8859-1-Zeichenfolge - Konvertieren einer einfachen Zeichenfolge in Unicode
Ein bisschen mehr Illustration - mit "Ä"
Codierung in UTF
Beziehung zwischen Unicode und UTF und Latin1
Unicode-Ausnahmen
Man würde diese umgehen, indem man von der spezifischen Codierung (lateinisch-1, utf8, utf16) in Unicode konvertiert, z
u8.decode('utf8').encode('latin1')
.Vielleicht könnte man also die folgenden Prinzipien und Verallgemeinerungen zeichnen:
str
ist eine Gruppe von Bytes, die eine von mehreren Codierungen aufweisen können, z. B. Latin-1, UTF-8 und UTF-16unicode
ist eine Menge von Bytes, die in eine beliebige Anzahl von Codierungen konvertiert werden können, am häufigsten UTF-8 und Latin-1 (iso8859-1).print
Befehl verfügt über eine eigene Logik zum Codieren , diesys.stdout.encoding
auf UTF-8 eingestellt ist und standardmäßig UTF-8 verwendetstr
in Unicode dekodieren , bevor man in eine andere Kodierung konvertiert.All dies ändert sich natürlich in Python 3.x.
Hoffe das leuchtet.
Weiterführende Literatur
Und die sehr anschaulichen Beschimpfungen von Armin Ronacher:
quelle
Für Python 3:
Ich habe dies für einen Text verwendet, der falsch als iso-8859-1 (mit Wörtern wie VeÅ \ x99ejnà © ) anstelle von utf-8 codiert ist . Dieser Code erzeugt die korrekte Version Veřejné .
quelle
bytes
kommen aus?r = requests.get(url)
und dann direkt Einstellungr.encoding = 'utf-8'
für mich funktioniertIn Unicode dekodieren, die Ergebnisse in UTF8 kodieren.
quelle
Ich mache das, ich bin mir nicht sicher, ob das ein guter Ansatz ist, aber es funktioniert jedes Mal !!
quelle