Hallo Krebs,
Ich versuch das auch mal in die gängigen Unicode-Terme zu erklären:
Prinzipiell kann eine Kodierung mehrere Kodierungsformate definieren und das kanonische Kodierungsformat muss nicht darunter sein.
Eine Kodierung (Unicode) kann mehrere Formate (UTF-8, UTF-16, UTF-32, diese UCS-Dinger) definieren, in denen die kodierten Zeichen tatsächlich gespeichert/übertragen werden. Ein kanonisches Kodierungsformat ist - wie Christian schon erwähnt hat - ein Format, das jedes Zeichen in einer Kodeeinheit speichert. Vorsicht: eine Kodeeinheit ist hier nicht zwangsläufig gleich einem Byte.
Ein Beispiel für ein kanonisches Kodierungsformat wäre ASCII oder ISO 8859-x: Jedes Zeichen wird ein einer Kodeeinheit kodiert: 7 Bit (bzw. 8 Bit = 1 Byte)
Für Unicode wäre ein kanonisches Kodierungsformat UTF-32, das für _jedes_ Zeichen 32 Bit benutzt. Für die meisten Zeichen wären das dann eine Menge von Nullen vorne dran, also eigentlich: Platzverschwendung. Deswegen gibt es auch andere Kodierungsformate:
Unicode 3.0 beispielsweise definiert nur zwei Kodierungsformate, nämlich UTF-8 und UTF-16 wobei UTF für Unicode Tranfer Format steht.
Und zwar UTF-8 und UTF-16:
UTF-8 hat eine Kodeeinheit von 8 Bits Länge und repräsentiert Kodepositionen mit einer bis vier Kodeeinheiten.
In UTF-8 werden die Zeichen je nach ihrer Kodeposition (Code Point), also der Nummer in den Unicode Tabellen in unterschiedlich lange Bytes gespeichert. Die kleinste Einheit ist das Byte, die größte sind vier Byte (oder sechs, siehe Christian und ISO).
Code Point Binärdarstellung in UTF-8
000000 - 00007F 0xxxxxxx
000080 - 0007FF 110xxxxx 10xxxxxx
000800 - 00FFFF 1110xxxx 10xxxxxx 10xxxxxx
010000 - 10FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
(Es ginge auch noch weiter, aber Unicode macht bei 10FFFF Schluß, im Gegensatz zu dem ISO-Standard.)
UTF-16 hat eine Kodeeinheit von 16 Bits Länge und repräsentiert Kodepositionen mit einer bis zwei Kodeeinheiten.
UTF-16 benutzt als kleinste Einheit zur Speicherung 16 Bit, eine Kodeeinheit beträgt also 16 Bit oder zwei Byte. UTF-16 benutzt aber für Werte jenseits von FFFF zwei Kodeeinheiten, also zweimal zwei Bytes:
Code Point Binärdarstellung in UTF-16
000000 - 00FFFF xxxxxxxx xxxxxxxx
010000 - 10FFFF 110110xx xxxxxxxx 110111xx xxxxxxxx
Voilá. Noch Fragen?
Tim