Das folgende ist also mein Versuch den Unterschied zwischen Unicode und UTF-X aus Leonidas' Folien, Wikipedia und dem Python-Wiki ein wenig auf die spezifische Fragestellung zu komprimieren.
Was ist Unicode?
Unicode ordnet jedem Zeichen aus der Unicode-Zeichenmenge (http://www.unicode.org/charts/) eine Zahl zu. Diese Zahl wird auch Codepoint genannt. Diese Zuordnung samt Zeichen- und Zahlenmenge nennt man Unicode.
Längere Erläuterung:
ß wird zum Beispiel die 223 zugeordnet. Anstatt durch die Dezimalzahl wird der Codepoint im Allgemeinen durch ein vorangestelltes "U+" gefolgt von der Hexadezimalenzahl kenntlich gemacht. Das ergäbe dann: U+DF (laut Wikipedia U+00DF, offensichtlich werden da noch Füllnullen eingebaut).
Python 2.6:
Code: Alles auswählen
>>> a = u'ß'
>>> type(a)
<type 'unicode'>
>>> a
u'\xdf' # df in Hexschreibweise entspricht der Dezimalschreibweise 223 'Was ist das Encoding?
Jeder Unicodezahl (Codepoint) wird eine Bytefolge zugeordnet, die so dann auch auf der Festplatte oder sonstwo gespeichert werden kann. Der Vorgang der Umwandlung von Codepoint -> Bytefolge nennt sich Enkodieren, der umgekehrte Weg heißt Dekodieren. Für den Kodierungsvorgang gibt es jetzt verschiedene Ansätze. Hier jetzt beispielsweise UTF-8: UTF-8 weißt jedem Codepoint ("Unicode-Zahl") eine Bytefolge variabler Länge zu. Die 2 lässt sich ganz gut mit einem Byte kodieren, die 25698 sicherlich nicht mehr(1 Byte = 8 Bit = 2^8 = 256 Möglichkeiten) und wird entsprechen mit mehr Bytes kodiert (wobei auch die 128 schon mit zwei Bytes kodiert wird - warum auch immer. Edit: die Erklärung hierfür findet sich im folgenden Beitrag von Lunar).
Code: Alles auswählen
ß <---------------------------------> U+00DF (223) <----------------------> 11000011:10011111 (in UTF-8)
Zeichen aus Unicodezeichemenge <-------------------> Codepoint (Zahl) <----------------------> Abfolge von Bytes
|--------------------------------Unicode-----------------------|
|--------------------Kodierung (z.B. UTF-8)-------------------|
------------------enkodieren-------->
<-------------dekodieren----------- In Python 2.x ist der Datentyp string 'str' eben eine Bytefolge, also ganz rechts in obiger Abbildung.
Test:
Code: Alles auswählen
>>> a = u'ß'
>>> type(a)
<type 'unicode'>
>>> b = a.encode('utf-8')
>>> b
'\xc3\x9f' # also c39f
>>> type(b)
<type 'str'>'Kurz:
'unicode'-Objekte in Python 2.x enthalten im Endeffekt den/die Codepoint/s des/der Zeichen/s, 'str'-Objekte sind eine spezielle Bytedarstellung des/r Zeichen/s.
