Vergleich von string und unicode in Python 2.7.5
Ich Frage mich, warum, wenn ich machen:
a = [u'k',u'ę',u'ą']
und geben Sie dann ein:
'k' in a
Bekomme ich True
, während:
'ę' in a
mir False
?
Es gibt mir wirklich Kopfschmerzen und es scheint, jemand hat das mit Absicht, um die Leute verrückt...
- Für was es Wert ist, dieses sich so verhält, wie Sie erwarten, dass in Python 3.
- Auf meinem Python (2.7.2), dies löst die Warnung
UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal
vor der RückkehrFalse
, das ist der Grund dafür. Mitu'ę' in a
funktioniert wie erwartet. - Quelle?
- Nur ich klebte es in mein Dolmetscher.
- Hat der interpreter die Verarbeitung von unicode-Eingabe?
- Ich bin mit python
2.7.15
,'ę' in a
ist Wahr, das ist seltsam...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Und warum ist das so?
In Python 2.x, das kann man nicht vergleichen unicode-string direkt für nicht-ascii-Zeichen. Dieser löst eine Warnung:
Jedoch in Python 3.x diese nicht angezeigt werden, da alle strings sind unicode-Objekte.
Lösung?
Können Sie entweder die Zeichenfolge unicode:
Nun, Sie sind zu vergleichen die beiden unicode-Objekte keine unicode-string.
Oder konvertieren Sie beide zu einer Codierung, beispielsweise utf-8, bevor Sie den Vergleich:
Auch für die Verwendung von nicht-ascii-Zeichen in Ihrem Programm haben, müssen Sie die Kodierung angeben, die am Anfang der Datei:
Hoffe, das hilft!
Müssen Sie explizit als unicode-string. Die folgenden zeigt ein Beispiel, und die Warnung gegeben, wenn Sie nicht, geben Sie es als unicode:
unicode('ę')
alles stürzt ab...u'ę'
ist einunicode
Objekt, während'ę'
ist einstr
Objekt in Ihrer aktuellen Ländereinstellung. Manchmal, je nach Gebietsschema, Sie werden die gleichen sein, und manchmal werden Sie nicht.Eines der schönen Dinge über Python 3 ist, dass der gesamte text ist in unicode, so dass dieses spezielle problem geht Weg.
Stellen Sie sicher, dass Sie geben Sie die Quell-code-Codierung und verwenden
u
vor der unicode-Literale.Diese funktioniert sowohl auf Python 3 und Python 2: