Unicode definiert einen einzelnen großen Zeichensatz, der jedem grafischen Symbol einen eindeutigen ganzzahligen Wert zuweist (dies ist eine wesentliche Vereinfachung und nicht wirklich wahr, aber für die Zwecke dieser Frage nah genug). UTF-8/16/32 sind einfach verschiedene Möglichkeiten, dies zu codieren.
Kurz gesagt, UTF-32 verwendet 32-Bit-Werte für jedes Zeichen. Dadurch können sie für jedes Zeichen einen Code mit fester Breite verwenden.
UTF-16 verwendet standardmäßig 16-Bit, aber das gibt Ihnen nur 65.000 mögliche Zeichen, was für den vollständigen Unicode-Satz bei weitem nicht ausreicht. Einige Zeichen verwenden daher Paare von 16-Bit-Werten.
Und UTF-8 verwendet standardmäßig 8-Bit-Werte, was bedeutet, dass die ersten 127 Werte Einzelbyte-Zeichen mit fester Breite sind (das höchstwertige Bit wird verwendet, um anzuzeigen, dass dies der Beginn einer Mehrbyte-Sequenz ist, wobei 7 übrig bleibt Bits für den tatsächlichen Zeichenwert). Alle anderen Zeichen werden als Sequenzen von bis zu 4 Bytes codiert (sofern Speicher vorhanden ist).
Und das führt uns zu den Vorteilen. Jedes ASCII-Zeichen ist direkt mit UTF-8 kompatibel. Für die Aktualisierung älterer Apps ist UTF-8 daher eine häufige und offensichtliche Wahl. In fast allen Fällen wird auch der geringste Speicher verwendet. Auf der anderen Seite können Sie keine Garantie für die Breite eines Zeichens geben. Es kann 1, 2, 3 oder 4 Zeichen breit sein, was die Manipulation von Zeichenfolgen schwierig macht.
UTF-32 ist das Gegenteil, es verwendet den meisten Speicher (jedes Zeichen hat eine feste Breite von 4 Byte), aber andererseits wissen Sie , dass jedes Zeichen genau diese Länge hat, sodass die Manipulation von Zeichenfolgen viel einfacher wird. Sie können die Anzahl der Zeichen in einer Zeichenfolge einfach aus der Länge der Zeichenfolge in Byte berechnen. Mit UTF-8 geht das nicht.
UTF-16 ist ein Kompromiss. Damit können die meisten Zeichen in einen 16-Bit-Wert mit fester Breite passen. Solange Sie keine chinesischen Symbole, Noten oder andere haben, können Sie davon ausgehen, dass jedes Zeichen 16 Bit breit ist. Es benötigt weniger Speicher als UTF-32. Aber es ist in gewisser Weise "das Schlimmste aus beiden Welten". Es verwendet fast immer mehr Speicher als UTF-8 und vermeidet immer noch nicht das Problem, das UTF-8 (Zeichen variabler Länge) plagt.
Schließlich ist es oft hilfreich, nur das zu wählen, was die Plattform unterstützt. Windows verwendet UTF-16 intern, daher ist dies unter Windows die naheliegende Wahl.
Linux variiert ein wenig, aber sie verwenden UTF-8 im Allgemeinen für alles, was Unicode-kompatibel ist.
So kurze Antwort: Alle drei Codierungen können denselben Zeichensatz codieren, aber sie repräsentieren jedes Zeichen als unterschiedliche Byte-Sequenzen.