Python: How to compare unicode unicode in variable
GELÖST
Habe ich das problem gelöst, vielen Dank allen für Ihre Zeit.
Erstens, dies sind die Anforderungen:
- Der Vergleich MUSS werden innerhalb der Variablen. (Vergleichen Sie 2 Variablen enthalten, die unicode)
- Die version von Python MUSS 2 sein.x , ich weiß, die version 3 hat das problem gelöst, aber leider funktioniert es nicht bei mir.
Also Hallo, ich habe einen bot programmiert in python und ich möchte es vergleichen 2 nicht-englische Buchstaben (unicode).
Das problem, das ich habe, ist, die Buchstaben MÜSSEN innerhalb der Variablen, so kann ich nicht verwenden:
u'letter'
Beiden Briefe, die ich vergleichen möchte MUSS werden innerhalb der Variablen.
Habe ich versucht:
buchstabe1 == buchstabe2 darstellen
es zeigt diese Fehlermeldung:
E:\bots\KiDo\KiDo.py:23: UnicodeWarning: Unicode equal comparison failed to convert beide Argumente in Unicode - interpretieren Sie als ungleiche
import sys
und immer False zurück, auch die 2 Buchstaben sind die gleichen.
Also ich denke, es bedeutet, dass ich den Vergleich 2-unicode-letters.
Und ausprobiert:
Brief = unicode(Brief)
aber es zeigt diese Fehlermeldung:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xd9 in position 0: ordinal not in range(128)
Ich habe gesucht alle über Google, aber alles was ich finden konnte ist, mit u'", aber dieses funktioniert nicht mit der Variablen.
Danke.
Vergleich Code:
word1 = parameters.split()[0]
word2 = parameters.split()[1]
word3 = parameters.split()[2]
word4 = parameters.split()[3]
word5 = parameters.split()[4]
if word1[0] == letter:
if word2[0] == letter:
if word3[0] == letter:
if word4[0] == letter:
if word5[0] == letter:
reply(type, source,u'True')
- ich bin nicht sicher, ob ich ganz Folgen, aber vielleicht ist diese lib kann helfen, pypi.python.org/pypi/Unidecode
- sind Sie sicher, dass bei der Verwendung
letter1 == letter2
zeigt es falsch immer ? sind Sie wirklich gleich? - Was ist die Codierung, die verwendet wird?
- Sieht aus wie Sie können nicht wirklich unicode-strings auf beiden Seiten. Print(Typ(buchstabe1)) oder was auch immer für mehr info. Denken Sie daran, dass UTF-8 von der großen Welt draußen hat dekodiert werden - text.decode('utf-8'), bevor es unicode. Darüber hinaus-code, den Sie einfügen, um zwischen den terminals und-Editoren können in eher unberechenbar Codierungen, so lehnen stark auf den Typ() prüfen. Schließlich, Ihr Ausgang wird gesetzt werden müssen, wieder in UTF8, sagen print(text.encode('utf-8')) ausgegeben werden. Versuchen Sie zu vermeiden, dass UTF-8-text lose im python2-Programm, verursacht das Kummer.
- Tut mir Leid, aber diese lib ist die gleiche wie bei allen anderen Lösungen, es handelt sich nicht um Variablen, was ich will, ist zu machen Sie eine Liste, wählen Sie ein Element nach dem Zufallsprinzip, legte es in eine variable, dann vergleichen Sie es mit unicode.
- Ja, ich bin mir 100% sicher, Sie sind die gleichen, weil ich den bot drucken beide Briefe & Sie sind die gleichen, aber es zeigt immer noch einen Fehler mit dem Vergleich.
- was ist deine python-version ?
- Ich bin im Umgang mit arabischen Buchstaben, soweit ich weiß, gelten Sie als unicode, und ich bin nicht ein problem mit der Ausgabe, die Ausgabe zeigt Arabische Buchstaben ohne Verlust oder Müll, das problem ist nur der Vergleich.
- 2.7 es ist die beste version der 2.x um mit mir zu arbeiten, ich habe versucht, all die anderen.
- Ich bitte um Verzeihung?
- wie Sie vergleichen ? pls fügen Sie Ihre versuchen, code zu Fragen !
- dies ist der Vergleich den code, und ich kann nach den ganzen code, wenn Sie möchten.
- also, welche Variablen Sie wurden im Vergleich in diesem code ? was
reply
Funktion ? - was ist der Parameter ? und wie Sie wissen, wort1[0] == Buchstabe ist ein unicode-Vergleich ? wenn Ihr meine ?
- der Brief ist eine zufällig gewählte Buchstaben aus einer Liste, während wort1,2,3,4,5 sind Wörter, die durch den Benutzer eingegeben, so wird der Vergleich zwischen dem Inhalt der Variablen Buchstaben und der erste Buchstabe der Eingabe des Benutzers. Antwort-Funktion ist genau wie die print-Funktion, wenn das Ergebnis dieses Vergleichs ist Ture, dann wird der bot senden Sie mir eine Nachricht Wahr ist, oder anders, es wird auch weiterhin den rest des Codes.
- Parameter ist der Befehl, der Benutzer sendet bot. ich.e: Befehl parm1 parm2 parm3 parm4 parm5. so, wort1 = Parameter.split()[0] , weisen parm1 zu wort1. und ich bin mir sicher, dass wort1[0] == Buchstabe ist ein unicode-Vergleich, weil ich den bot senden Sie mir den Inhalt wort1[0] & Buchstaben, und Sie sind die gleichen, aber es zeigt immer noch einen Fehler mit dem Vergleich.
- in diesem Fall haben Sie 5 geschachtelte for-Schleife, die, wenn Sie false ist, wird der code nicht weiter!!! ich havnt keine Idee ! nur poste ich die Antwort zu sehen, was die out put von meinem code ! wie diese !
Du musst angemeldet sein, um einen Kommentar abzugeben.
Look, der Buchstabe ç (ein char, der nicht in ASCII) kann dargestellt werden als ein str-Objekt oder als unicode-Objekt (vielleicht sind Sie ein wenig verwirrt über das, was unicode bedeutet).
Auch, wenn Sie versuchen, erstellen Sie eine unicode-Objekt, die nicht im ASCII-Tabelle, müssen Sie passieren eine andere Kodierung Tabelle:
Dieser löst ein UnicodeDecodeError weil 'ç' ist nicht in ASCII, sondern
arbeiten, weil 'ç' vorgestellt, die in UTF-8-Kodierung Tabelle (als Ihre arabischen Buchstaben).
Vergleichen kann man unicode-Objekte mit unicode-Objekte die gleiche Weise können Sie vergleichen, str Objekte mit str-Objekte, und all das muss funktionieren.
Können, können Sie auch vergleichen, ein str-Objekt mit unicode-Objekt, aber das ist fehleranfällig, wenn Sie vergleichen, die nicht-ASCII-Zeichen: 'ç' als str '\xc3\xa7', sondern als unicode-es ist nur '\xe7' (False zurückgeben, in einem Vergleich).
Also @Karsa kann wirklich sein Recht. Das problem mit der 'Variablen' (in Python, ein besseres Wort ist-Objekte). Sie müssen bestätigen, dass Sie den Vergleich nur str oder nur unicode-Objekte.
So, einen besseren code könnte sein:
dies ist mein Versuch base auf jede Sache, die Sie sagen :
so, ich bin sicher, dass es ein problem mit der Variablen ! ich schlage vor Sie vergleichen Sie versuchen, diese zu drucken ! um zu sehen, was unter der Variablen !
Denke ich, dass Sie nicht verstehen, Unicode vs. encoding.
Finden Sie in diesem Artikel: http://www.joelonsoftware.com/articles/Unicode.html
Beachten Sie die folgenden... UTF-8 ist eine Kodierung von Unicode, aber ist nicht Unicode. Die
# coding: utf-8
Erklärung oben in der Quelle unten, erklärt Sie die Kodierung der Quelldatei als auf der Festplatte gespeichert.a = u'ç'
erklärt Unicode variable.b = 'ç'
ist ein byte-string in der Quell-Kodierung (utf-8).Beachten Sie, dass
repr
zeigt verschiedene source-ähnliche Darstellung der Zeichenfolge, so dass Sie können sagen, der Unterschied.type
gibt den Objekt-Typ.a
undb
drucken die gleichen, aber sind nicht das gleiche:Ihre
letter1
undletter2
sind zwei verschiedene Arten von strings.Hier ist ein vollständiges Beispiel das Lesen eines word-Liste aus einer Datei und nehmen Eingaben von einem Benutzer:
Ausgabe von UNS Windows-Konsole. Beachten Sie, dass die verschiedenen Konsolen haben verschiedene Codierungen. Linux ist in der Regel UTF-8. Nicht-US-Windows-Konsole können unterschiedlich sein.
a
undb
nicht gespeichert werden, auf die gleiche Weise.a
gespeichert wird als Unicode-string-Objekt, währendb
gespeichert ist, als ein kodiertes byte-string. Als die Warnung gibt an, es versucht zu konvertierenb
Unicode-machen Sie den Vergleich und scheitern. Es schlägt fehl, da Python 2.X standardmäßig Decodierung mit ASCII und die Daten in UTF-8-Codierung. Vergleichena == b.decode('utf-8')
würde das Problem beheben. Auch Unicode-Zeichenfolgen codiert werden intern in einem bestimmten format. Auf Python 2.X,, die passiert tatsächlich als UTF-16. Sie vergleichen die gleichen Codierungen.a == b
oben alsu'\xe7' == '\xc3\xa7'
. Natürlich nicht gleich, richtig?letter2 = unicode(letter2)
aber es hat nicht funktioniert als gut. Tut mir Leid, aber scheint, Sie konzentriert sich auf das, was ich sagte, aber nicht die Lösung. Trotzdem vielen Dank.a
undb
"Variablen". Müssen Sie konvertieren Sie Ihre Variablen auf den gleichen Typ.a
undb
sind zwei verschiedene Typen. Es spielt keine Rolle, wie man die Werte in den Variablen. Sie muss zu vergleichen, der gleiche Variablen-Typen..encode(encoding)
stellt Unicode-strings in byte-strings, und die.decode(encoding)
dreht byte-Zeichenfolgen in Unicode-Zeichenfolgen. Ich füge ein Beispiel für die Konvertierung..decode(encoding)
vor dem Vergleich mit den Unicode-Charakter-Listen. Würde es helfen, wenn Sie hatte eine komplette Beispiel für Ihr Programm, um Ihnen genau sagen, wie es zu lösen ist.Wenn Sie brauchen, um zu vergleichen einzelne Buchstaben können Sie immer vergleichen Sie den tatsächlichen Wert mit
ord(a)==ord(b)
.In Antwort auf das Beispiel gepostet:
Sie tun müssen, um konsistent zu markieren unicode als unicode, also setzen die
u
vor die Anführungszeichen.ord(c) == ord(u'”')
und zurückFalse
wennc
waru'”'
.Python 2.7.6 (default, Mar 22 2014, 22:59:56) [GCC 4.8.2] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> c=u'"' >>> ord(c) 34 >>> ord(u'"') 34 >>> ord(u'"') == ord(c) True >>>
u
vor die Anführungszeichen, die Sie auslösen, die Funktion von der Kommandozeile aus (wo kann man die Eingabe der Buchstaben manuell), aber wenn Sie Lesen Sie die erste Zeile in meiner Frage, wenn der Benutzer einen Brief, wird er gespeichert in einer Variablen, die dann die bot gehen mit dem Vergleich, in diesem Fall, es ist nicht möglich, mit demu
mit einer Variablen.