Unicode und Codierungen sind völlig unterschiedliche, nicht miteinander verbundene Dinge.
Unicode
Weist jedem Zeichen eine numerische ID zu:
- 0x41 → A.
- 0xE1 → á
- 0x414 → Д
Daher weist Unicode A die Nummer 0x41, á 0xE1 und Д 0x414 zu.
Sogar der kleine Pfeil →, den ich verwendet habe, hat seine Unicode-Nummer, es ist 0x2192. Und selbst Emojis haben ihre Unicode-Nummern, 😂 ist 0x1F602.
Sie können die Unicode-Nummern aller Zeichen in dieser Tabelle nachschlagen . Insbesondere die ersten drei Zeichen oben findet hier , Pfeil die hier und die Emojis hier .
Diese von Unicode allen Zeichen zugewiesenen Nummern werden als Codepunkte bezeichnet .
Der Zweck all dessen ist es, ein Mittel bereitzustellen, um sich eindeutig auf jedes Zeichen zu beziehen. Wenn ich zum Beispiel über 😂 spreche, anstatt zu sagen "Sie wissen, dieses lachende Emoji mit Tränen" , kann ich einfach sagen: Unicode-Codepunkt 0x1F602 . Einfacher, oder?
Beachten Sie, dass Unicode-Codepunkte normalerweise mit einem führenden Format formatiert U+
werden und der hexadezimale numerische Wert auf mindestens 4 Stellen aufgefüllt wird. Die obigen Beispiele wären also U + 0041, U + 00E1, U + 0414, U + 2192, U + 1F602.
Unicode-Codepunkte reichen von U + 0000 bis U + 10FFFF. Das sind 1.114.112 Zahlen. 2048 dieser Zahlen für verwendet werden Surrogate , so verbleiben 1.112.064. Dies bedeutet, dass Unicode 1.112.064 verschiedenen Zeichen eine eindeutige ID (Codepunkt) zuweisen kann. Noch sind nicht alle diese Codepunkte einem Zeichen zugeordnet, und Unicode wird kontinuierlich erweitert (z. B. wenn neue Emojis eingeführt werden).
Es ist wichtig, sich daran zu erinnern, dass Unicode lediglich jedem Zeichen eine numerische ID (Codepunkt) zuweist, um eine einfache und eindeutige Bezugnahme zu ermöglichen.
Kodierungen
Ordnen Sie Zeichen Bitmustern zu.
Diese Bitmuster werden verwendet, um die Zeichen im Computerspeicher oder auf der Festplatte darzustellen.
Es gibt viele verschiedene Codierungen, die verschiedene Teilmengen von Zeichen abdecken. Im englischsprachigen Raum sind die häufigsten Codierungen die folgenden:
Ordnet 128 Zeichen (Codepunkte U + 0000 bis U + 007F) Bitmustern der Länge 7 zu.
Beispiel:
Sie können alle Zuordnungen in dieser Tabelle sehen .
Ordnet 191 Zeichen (Codepunkte U + 0020 bis U + 007E und U + 00A0 bis U + 00FF) Bitmustern der Länge 8 zu.
Beispiel:
- a → 01100001 (0x61)
- → 11100001 (0xE1)
Sie können alle Zuordnungen in dieser Tabelle sehen .
Karten 1.112.064 Zeichen (alle Unicode vorhandene Code Punkte) Bitmustern beiden Längen 8, 16, 24 oder 32 Bits (das heißt, 1, 2, 3 oder 4 Bytes).
Beispiel:
- a → 01100001 (0x61)
- → 11000011 10100001 (0xC3 0xA1)
- → 11100010 10001001 10100000 (0xE2 0x89 0xA0)
- → 11110000 10011111 10011000 10000010 (0xF0 0x9F 0x98 0x82)
Die Art und Weise UTF-8 kodiert Zeichen Bitfolgen ist sehr gut beschrieben hier .
Unicode und Codierungen
Anhand der obigen Beispiele wird deutlich, wie nützlich Unicode ist.
Wenn ich zum Beispiel Latin-1 bin und meine Kodierung von á erklären möchte, muss ich nicht sagen:
"Ich codiere das a mit einem Aigu (oder wie auch immer Sie diesen ansteigenden Balken nennen) als 11100001"
Aber ich kann nur sagen:
"Ich codiere U + 00E1 als 11100001"
Und wenn ich UTF-8 bin, kann ich sagen:
"Ich wiederum codiere U + 00E1 als 11000011 10100001"
Und jedem ist eindeutig klar, welchen Charakter wir meinen.
Nun zu der oft auftretenden Verwirrung
Es ist wahr, dass manchmal das Bitmuster einer Codierung, wenn Sie es als Binärzahl interpretieren, mit dem Unicode-Codepunkt dieses Zeichens identisch ist.
Beispielsweise:
- ASCII codiert a als 1100001, was Sie als Hexadezimalzahl 0x61 interpretieren können , und der Unicode-Codepunkt von a ist U + 0061 .
- Latin-1 codiert á als 11100001, was Sie als Hexadezimalzahl 0xE1 interpretieren können , und der Unicode-Codepunkt von á ist U + 00E1 .
Natürlich wurde dies aus Bequemlichkeitsgründen absichtlich so angeordnet. Aber Sie sollten es als reinen Zufall betrachten . Das Bitmuster, das zur Darstellung eines Zeichens im Speicher verwendet wird, ist in keiner Weise an den Unicode-Codepunkt dieses Zeichens gebunden.
Niemand sagt, dass Sie eine Bitfolge wie 11100001 als Binärzahl interpretieren müssen. Betrachten Sie es einfach als die Folge von Bits, mit denen Latin-1 das Zeichen á codiert .
Zurück zu Ihrer Frage
Die von Ihrem Python-Interpreter verwendete Codierung ist UTF-8 .
In Ihren Beispielen ist Folgendes vor sich:
Beispiel 1
Im Folgenden wird das Zeichen á in UTF-8 codiert. Daraus ergibt sich die Bitfolge 11000011 10100001, die in der Variablen gespeichert wird a
.
>>> a = 'á'
Wenn Sie sich den Wert von ansehen a
, wird sein Inhalt 11000011 10100001 als Hexadezimalzahl 0xC3 0xA1 formatiert und wie folgt ausgegeben '\xc3\xa1'
:
>>> a
'\xc3\xa1'
Beispiel 2
Im Folgenden wird der Unicode-Codepunkt von á, der U + 00E1 ist, in der Variablen ua
gespeichert (wir wissen nicht, welches Datenformat Python intern verwendet, um den Codepunkt U + 00E1 im Speicher darzustellen, und es ist für uns unwichtig):
>>> ua = u'á'
Wenn Sie sich den Wert von ansehen ua
, sagt Python, dass er den Codepunkt U + 00E1 enthält:
>>> ua
u'\xe1'
Beispiel 3
Das Folgende codiert den Unicode-Codepunkt U + 00E1 (der das Zeichen á darstellt) mit UTF-8, was zu dem Bitmuster 11000011 10100001 führt. Wiederum wird dieses Bitmuster für die Ausgabe als Hexadezimalzahl 0xC3 0xA1 dargestellt:
>>> ua.encode('utf-8')
'\xc3\xa1'
Beispiel 4
Das Folgende codiert den Unicode-Codepunkt U + 00E1 (der das Zeichen á darstellt) mit Latin-1, was zum Bitmuster 11100001 führt. Für die Ausgabe wird dieses Bitmuster als Hexadezimalzahl 0xE1 dargestellt, die zufällig mit der Initiale identisch ist Codepunkt U + 00E1:
>>> ua.encode('latin1')
'\xe1'
Es gibt keine Beziehung zwischen dem Unicode-Objekt ua
und der Latin-1-Codierung. Dass der Codepunkt von á U + 00E1 ist und die Latin-1-Codierung von á 0xE1 ist (wenn Sie das Bitmuster der Codierung als Binärzahl interpretieren), ist ein reiner Zufall.
unicode
, es ist nur eine Abstraktion von Unicode-Zeichen;unicode
kannstr
mit etwas Codierung (zButf-8
) konvertiert werden .