Python - Lesen Von Unicode-Emoji-Zeichen
Habe ich ein Python 2.7 Programm liest iOS-SMS-Nachrichten aus einer SQLite-Datenbank. Die text-Nachrichten sind unicode-strings. In der folgenden SMS:
u'that\u2019s \U0001f63b'
Den Apostroph vertreten durch \u2019
, aber die emoji wird vertreten durch \U0001f63b
. Ich schaute auf die code-point für die emoji in Frage, und es ist \uf63b
. Ich bin mir nicht sicher, wo der 0001
kommt. Ich weiß, komisch wenig über Zeichenkodierungen.
Wenn ich drucken den text, Zeichen für Zeichen, Verwendung:
s = u'that\u2019s \U0001f63b'
for c in s:
print c.encode('unicode_escape')
Das Programm erzeugt die folgende Ausgabe:
t
h
a
t
\u2019
s
\ud83d
\ude3b
Wie kann ich richtig gelesen, diese letzten Zeichen in Python? Bin ich mit codieren richtig hier? Sollte ich einfach versuchen, in den Papierkorb, diese 0001
s vor, es zu Lesen, oder gibt es einen einfacheren, weniger dumme Art und Weise?
0xf63b
ist in die "Private Nutzung" im Abschnitt Unicode. Sind Sie sicher, dass das richtig ist? Ihre codepoint ist wahrscheinlich0x1f63b
, wie das ist, eine "lächelnde Katze mit Herz-Augen" emoji".- Wie haben Sie festgestellt, dass
\uf63b
wäre ein Emoji-Zeichen? Nach meinem Hinweis, es ist nicht definiert: fileformat.info/info/unicode/char/f63b/index.htm
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich glaube nicht, dass man mit codieren richtig, noch brauchen Sie. Was Sie haben, ist ein Gültiger unicode-string mit einem 4-stellige und eine 8-stellige escape-Sequenz. Versuchen Sie, diese in die REPL auf, sagen wir, OS X
In Python ist3, obwohl -
U+FFFF
. Dies ist ein bug in Python 2 eine Menge von Sprachen, die haben das problem mit diesen Zeichen.Ihre Letzte Teil der Verwirrung ist wahrscheinlich auf die Tatsache zurückzuführen, dass Sie laufen, was man eine "schmale Python bauen". Python kann nicht halten ein einzelnes Zeichen, das mit genügend Informationen, um zu halten, einen einzigen emoji. Die beste Lösung wäre, sich zu bewegen auf Python 3. Ansonsten, versuchen zu verarbeiten, die UTF-16-ersatzpaar.
regex.findall(r'\X', unicode_text)
könnte verwendet werden, um "Benutzer wahrgenommenen Zeichen" erstrecken kann mehr als einen Unicode-codepoint (es ist nicht Surrogat-Paare, aber es sollte das Problem beheben als Nebeneffekt).