Schreiben von utf-8-string in meine python-Dateien
Diese Zeile in meiner .py-Datei gibt mir ein: "UnicodeDecodeError: 'utf8' codec can T decode bytes in position 8-13: nicht unterstützte Unicode-code-range"
if line.startswith(u"Fußnote"):
Die Datei ist in utf-8 gesichert und hat die Codierung an der Spitze:
# -- coding: utf-8 --
Ich habe eine Menge von anderen py-Dateien mit utf-8-kodiert chinesischen text in den Kommentaren und in array Beispiel: arr = [u"chinese text"] also ich Frage mich, warum in diesem Fall insbesondere nicht für mich arbeiten.
- Wie Sie wissen, für sicher, es ist wirklich utf-8. Kann man sich die entsprechende Ausgabe von
od -t c
auf die Datei (wenn Unix)? - Es gibt auch
hexdump -C
auf den meisten GNU/Linux-Distributionen undhd(1)
auf FreeBSD. - Danke Jungs für die tollen Antworten, ich bin umgezogen und bin Weg von meinem windows-Rechner, an dem ich arbeitete. Ich war dabei mir die Haare über diese, aber ich glaube, dass ich endlich verstehen, unicode. Wenn ich wieder werd ich es akzeptieren, eine Antwort.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Let ' s überprüfen, dass die Fehlermeldung sehr genau:
"UnicodeDecodeError: 'utf8' codec can T decode bytes in position 8-13: nicht unterstützte Unicode-code-range"
Beachten Sie, dass es sagt, "bytes in position 8-13" - eine 6-byte UTF-8 sequence. Vielleicht war gültig in den dunklen Zeiten, aber seit Unicode eingefroren wurde am 21 bits, die maximal VIER bytes. UTF-8 Validierung und error reporting verschärft wurden bis vor kurzem; als eine Angelegenheit von Interesse, genau das, was Python version verwendest du?
Mit 2.7.1 und 2.6.6 zumindest, dass Fehler wird, desto mehr nützlich "... kann nicht decodieren byte XXXX in position 8: invalid start byte" XXXX kann nur 0xfc oder 0xfd, wenn die alte Nachricht schlug ein 6-byte-Sequenz. In ISO-8859-1 oder cp1252, 0xfc stellt U+00 FC LATIN SMALL LETTER U WITH DIAERESIS (aka u-umlaut, wahrscheinlich ein Verdächtiger); 0xfd darstellt, U+00FD LATIN SMALL LETTER Y WITH ACUTE (weniger wahrscheinlich).
Das problem ist NICHT mit der
if line.startswith(u"Fußnote"):
- Anweisung in der Quelldatei. Sie bekommen eine Nachricht zur COMPILE-Zeit, wenn es nicht proper UTF-8, und die Nachricht begann mit "SyntaxError", nicht "UnicodeDecodeError". In jedem Fall ist die UTF-8-Codierung dieses Strings ist nur 8 bytes lang, nicht 14.Das problem ist (wie @Mark Tolonen hat darauf hingewiesen), in welcher "Zeile" bezieht. Es kann nur ein str-Objekt.
Weiter erhalten, die Sie benötigen, zu beantworten, Markieren Sie die Fragen, (1) Ergebnis der
print repr(line)
(2)site.py
ändern.In diesem Stadium ist es eine gute Idee, um die klare Luft zu mischen
str
undunicode
Objekte (in vielen betrieben, nicht nura.startswith(b)
)., Es sei denn, die operation ist definiert, um zu produzieren ein
str
Objekt, es wird NICHT zwingen, dieunicode
Objektstr
. Dies ist nicht der Fall mita.startswith(b)
.Es wird versucht zu entschlüsseln, diestr
- Objekt mit den Standardeinstellungen (in der Regel ascii) - Kodierung.Beispiele:
Darüber hinaus es ist NICHT richtig zu sagen "Mix, und Sie erhalten UnicodeDecodeError". Es ist durchaus möglich, dass die
str
Objekt ist gültig codiert in der Standard-Kodierung (normalerweise 'ascii') -- keine exception ausgelöst.Beispiele:
Kann ich reproduzieren, die UnicodeDecodeError mit diesem code:
Beachten Sie, dass
line
ist ein string-Objekt, aberu"Fußnote"
ist ein unicode-Objekt.Da
line
ist ein string-Objekt, das unicode-Objekt in ein string-Objekt in dem Aufrufstartswith
. In Python2 die Standardeinstellung ist, um zu versuchen zu entschlüsseln unter Verwendung des ascii-codec.Da
u"ß"
nicht decodiert werden kann mit der ascii-codec, ein UnicodeDecodeError ausgelöst.Den Fehler können vermieden werden, wenn Sie zuerst
line
ein unicode-Objekt:oder wenn Sie zuerst
u"Fußnote"
ein string-Objekt:str
] Objekt im Aufruf startswith. Siehe meine Antwort.Gibt der Fehler Linie ist nicht eine Unicode-Zeichenfolge. In
X.startswith(Y)
beide X und Y sein müssen, Unicode oder byte-string. Mix und Sie erhalten UnicodeDecodeError.print repr(line)
zu überprüfen. Haben auch Sie verändertsite.py
ändern Sie die Standard-Kodierung von 'ascii' auf 'utf8'? In der Regel ist es die 'ascii' codec ist der Standard für Python 2.x.Ohne zu sehen, Ihren code, es ist unklar, ob das problem ist der code oder die Daten-Datei der code ist Lesen.
Wenn Sie die Datei öffnen, werden Sie tun:
oder:
Was bedeutet:
sagen, wenn Sie es hinzufügen, nur unter der
open
Linie?Diese beiden Möglichkeiten für mich:
und so:
In den ersten ein, lasse ich die Python-Standard zum öffnen der Datei als byte-stream, dann konvertieren Sie jede Zeile aus einem byte-stream in einen Unicode-string mit
uline = line.decode("utf-8")
.In der zweiten, öffne ich die Datei als UTF-8 kodierte Datei, so dass Python Unicode-strings zurückgibt, wenn ich die Iteration über die Datei.
BEARBEITEN
Hier ist eine triviale Art und Weise, die Sie verwenden können, um herauszufinden, ob die Datei enthielt nicht-utf8-Daten.
Und ein Beispiel für Sie im Einsatz:
In dem Beispiel, das 4. byte (position 3, gezählt von 0) ist
200
oktal/0x80
hexadezimal.Die Wikipedia UTF-8 Artikel zeigt, dass, wäre nur gültig, da die zweiten byte eines zwei-byte-Sequenz.
Ihre Datei ist gespeichert in einer anderen Kodierung und nicht UTF-8. Herauszufinden, mit welchem encoding die Datei im (evtl. CP1252 oder so), und erklären, dass statt.