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.