Ihre Frage ist falsch; Der Fehler, den Sie sehen, ist nicht das Ergebnis der Erstellung von Python, sondern eine Verwechslung zwischen Byte-Strings und Unicode-Strings.
Byte-Strings (z. B. "foo" oder "bar" in der Python-Syntax) sind Sequenzen von Oktetten. Zahlen von 0-255. Unicode-Zeichenfolgen (z. B. u "foo" oder u'bar ') sind Sequenzen von Unicode-Codepunkten. Zahlen von 0-1112064. Sie scheinen jedoch an dem Zeichen é interessiert zu sein, das (in Ihrem Terminal) eine Mehrbyte-Sequenz ist, die ein einzelnes Zeichen darstellt.
ord(u'é')
Versuchen Sie stattdessen Folgendes:
>>> [ord(x) for x in u'é']
Das sagt Ihnen, welche Folge von Codepunkten "é" darstellt. Es kann Ihnen [233] geben, oder es kann Ihnen [101, 770] geben.
Anstatt chr()
dies umzukehren, gibt es unichr()
:
>>> unichr(233)
u'\xe9'
Dieses Zeichen kann tatsächlich entweder ein einzelner oder mehrere Unicode- "Codepunkte" sein, die selbst entweder Grapheme oder Zeichen darstellen. Es ist entweder "e mit einem akuten Akzent (dh Codepunkt 233)" oder "e" (Codepunkt 101), gefolgt von "einem akuten Akzent auf dem vorherigen Zeichen" (Codepunkt 770). So kann genau dieses Zeichen als Python-Datenstruktur u'e\u0301'
oder dargestellt werden u'\u00e9'
.
Die meiste Zeit sollten Sie sich nicht darum kümmern müssen, aber es kann zu einem Problem werden, wenn Sie über eine Unicode-Zeichenfolge iterieren, da die Iteration nach Codepunkt und nicht nach zerlegbaren Zeichen funktioniert. Mit anderen Worten len(u'e\u0301') == 2
und len(u'\u00e9') == 1
. Wenn dies für Sie wichtig ist, können Sie mithilfe von zwischen zusammengesetzten und zerlegten Formularen konvertieren unicodedata.normalize
.
Das Unicode-Glossar kann eine hilfreiche Anleitung zum Verständnis einiger dieser Probleme sein, indem aufgezeigt wird, wie sich die einzelnen Begriffe auf einen anderen Teil der Textdarstellung beziehen, was weitaus komplizierter ist, als viele Programmierer erkennen.