Wie wird Unicode intern in Python dargestellt?

8

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

    
Nishant 27.09.2014, 21:28
quelle

1 Antwort

11

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.

    
Martijn Pieters 27.09.2014, 21:32
quelle