Wie wird Unicode-String in Pythons Speicher buchstäblich dargestellt?
Zum Beispiel könnte ich 'abc'
als äquivalente ASCII-Bytes im Speicher darstellen. Integer könnte man sich als die Komplimentdarstellung der 2 vorstellen. Wie auch immer u'\u2049'
, obwohl in UTF-8
als '\xe2\x81\x89'
- 3 Bytes lang dargestellt wird, wie visualisiere ich den Literal u'\u2049'
Codepunkt im Speicher?
Gibt es eine bestimmte Art, wie es im Speicher gespeichert wird? Behandeln Python 2 und Python 3 es anders?
Wenige verwandte Fragen für Neugierige:
1) Wie sind diese Zeichenfolgen intern im Python-Interpreter dargestellt? Ich verstehe nicht
2) Was ist die interne Repräsentation von string in Python 3.x
Python 2 und Python 3.0-3.2 verwenden entweder UCS2 * oder UCS4 für Unicode-Zeichen, was bedeutet, dass entweder 2 Bytes oder 4 Bytes für jedes Zeichen verwendet werden. Welches ausgewählt wird, ist eine Kompilierzeit-Option.
\u2049
wird dann als \x49\x20
oder \x20\x49
oder \x49\x20\x00\x00
oder \x00\x00\x20\x49
dargestellt, abhängig von der nativen Byte-Reihenfolge Ihres Systems und wenn UCS2 oder UCS4 ausgewählt wurde. ASCII-Zeichen in einer Unicode-Zeichenfolge verwenden immer noch 2 oder 4 Bytes pro Zeichen.
Python 3.3 wechselte zu einer neuen internen Repräsentation und verwendete die kompakteste Form, die benötigt wird, um alle Zeichen in einer Zeichenkette darzustellen. Entweder 1 Byte, 2 Byte oder 4 Byte werden ausgewählt. ASCII- und Latin-1-Text verwendet nur 1 Byte pro Zeichen, der Rest der BMP-Zeichen benötigt 2 Byte und danach werden 4 Byte verwendet.
Siehe PEP-393: Flexible String-Darstellung für die vollständige Darstellung tief auf diese Darstellungen.
* Technisch betrachtet verwendet der UCS-2-Build UTF-16, da Nicht-BMP-Zeichen UTF-16-Ersatzzeichen verwenden, um jeweils 4 Byte (2 UTF-16-Zeichen) zu codieren. In der Python-Dokumentation wird dies jedoch immer noch als UCS2 bezeichnet.
Dies führt zu unerwartetem Verhalten, z. B. wenn len()
für Nicht-BMP-Unicode-Zeichenfolgen länger ist als die Anzahl der enthaltenen Zeichen.
Tags und Links python string unicode python-internals