Python UTF-8-Vergleich
a = {"a":"çö"}
b = "çö"
a['a']
>>> '\xc3\xa7\xc3\xb6'
b.decode('utf-8') == a['a']
>>> False
Was ist Los in da?
edit= tut mir Leid, es war mein Fehler. Es ist immer noch Falsch. Ich bin mit Python 2.6 unter Ubuntu 10.04.
InformationsquelleAutor der Frage erkangur | 2010-08-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mögliche Lösungen
Entweder schreiben wie dieses:
Oder so (Sie können auch überspringen Sie die
.decode('utf-8')
auf beiden Seiten):Oder so (meine Empfehlung):
Erklärung
Aktualisiert, basierend auf Tim ' s Kommentar. In deinem ursprünglichen code
b.decode('utf-8') == u'çö'
unda['a'] == 'çö'
Sie sind also eigentlich macht der folgende Vergleich:Eines der Objekte vom Typ
unicode
die andere ist der Typstr
so dass bei der Ausführung des Vergleichs, diestr
umgewandeltunicode
und dann die beidenunicode
Objekte verglichen werden. Es funktioniert gut in den Fall rein ASCII-strings, z.B.:u'a' == 'a'
daunicode('a') == u'a'
.Jedoch nicht im Falle von
u'çö' == 'çö'
daunicode('çö')
gibt die folgende Fehlermeldung zurück: UnicodeDecodeError: 'ascii' codec can T decode byte 0xc3 in position 0: ordinal not in range(128)und daher der ganze Vergleich False zurück, und Sie erhalten die folgende Warnung: UnicodeWarning: Unicode equal comparison failed to convert beide Argumente in Unicode - interpretieren Sie als ungleiche.InformationsquelleAutor der Antwort Bolo
b
ist einstring
a
ist eindict
Du willst (glaube ich):
b == a['a']
InformationsquelleAutor der Antwort NullUserException
UTF-8 ist eine Codierung verwendet, um Datensatz-Unicode-text-Dateien. Allerdings in Python werden Sie mit Objekten arbeiten, die haben eine Feste Methode zur Darstellung von Unicode-text, und dieser Weg ist nicht UTF-8.
Können Sie immer noch vergleichen Sie Unicode-strings in Python, aber das ist nicht UTF-8, mit der Ausnahme, dass, wenn Sie wollen, um Konstanten in diese Unicode-strings sind, dann müssen Sie codieren den text aus der Datei mit source-code in UTF-8. Sobald der Zuweisungsoperator ausgeführt wird, wird die Zeichenfolge nicht mehr UTF-8, aber jetzt ist das Python-interne Darstellung.
Durch die Art und Weise, wenn Sie dabei sind, Vergleiche mit Unicode, werden Sie wahrscheinlich wollen, verwenden Sie das Modul unicodedata und normalisieren Sie die Saiten, bevor die Vergleiche durchgeführt werden.
InformationsquelleAutor der Antwort Michael Dillon
Versuchen
b = = ['a']
InformationsquelleAutor der Antwort PaulMcG
Du vergleichst einen string, ein dict.
Vergleicht man die saite (b), die Mitglied eines (a['a']), dann erhalten Sie das gewünschte Ergebnis.
InformationsquelleAutor der Antwort brennie
Stellen Sie sicher, dass Ihr code in UTF-8 (NICHT-Latin-1) und/oder die Verwendung eines coding-Zeile etwa so:
Wenn Sie die Verwendung von unicode auf der ganzen Linie, die Sie importieren können unicode_literals aus der Zukunft, und um wieder auf Codierung Kummer:
Wenn eine Datei verwendet unicode_literals, alle "strings" werden jetzt u"unicode" - Objekte (gemäß der Codierung der Datei), wenn Sie nicht b"vorangestellt" mit einem b (Emulation der string/bytes gesplittet in Python 3.X).
InformationsquelleAutor der Antwort Jason Scheirer
NullUserException ist richtig, dass diese korrekt sein sollten:
Du bist noch immer "Falsche", weil man die Dekodierung der einen Seite als utf-8 (eine Unicode-Zeichenfolge), während die andere Seite bleibt eine utf-8-kodierten byte-string.
InformationsquelleAutor der Antwort chryss