Unicode ist ein Zeichensatz. UTF sind Kodierungen.
Unicode definiert eine Menge von Zeichen mit entsprechenden Codepunkten, z. Werte, die eindeutig Zeichen im Unicode-Zeichensatz identifizieren.
Zum Beispiel entspricht unicode-table.com U+0041
der Hauptstadt A, U+03A3
ist griechische Hauptstadt Sigma (Σ) und U+2603
ist ein Schneemann (). U+
Zahlen sind Codepunkte. Unicode sagt uns, welches Symbol welchem Codepunkt entspricht, aber nicht, wie diese Codepunkte in Byte zu codieren sind.
Hier kommt das UTF (Unicode Transformation Format) ins Spiel. UTF ist eine Codierung: Es ordnet Unicode-Codepunkte eindeutigen Byte-Sequenzen zu.
UTF-32 ist die "dumme" Kodierung. Alle Unicode-Codepunkte sind höchstens 4 Byte lang, sodass UTF-32 den Codepunkt einfach als 4-Byte-Zahl (32-Bit, daher der Name) mit der Big-Endian-Byte-Reihenfolge interpretiert . So
U+2603
wird als verschlüsselt0x00002603
.UTF-32 ist sehr einfach, aber auch sehr redundant. Die am häufigsten verwendeten Zeichen liegen im ASCII-Bereich und werden in Unicode durch die Codepunkte 0-127 dargestellt. In UTF-32-kodierten Dateien sind fast 3 von 4 Bytes Nullen. Nahezu jeder englische Satz wird 4-mal länger (in Bytes), wenn er anstelle von ASCII in UTF-32 codiert wird.
UTF-8 (im Internet sehr verbreitet) verwendet nur 1 Byte für ASCII-Zeichen, sodass in ASCII-Dateien kein Overhead entsteht (jede ASCII-Datei ist auch eine UTF-8-Datei mit demselben Inhalt). Andere Zeichen benötigen bis zu 6 Byte.
UTF-16 (nur von Windows verwendet, um nur ein Beispiel zu nennen) ist ein Kompromiss zwischen UTF-32 und UTF-8. Codepunkte werden entweder in 16-Bit- oder 32-Bit-Sequenzen codiert. In den meisten Fällen ist es redundanter als UTF-8, aber einfacher zu warten und schneller zu verarbeiten.
Unterschiedliche Zeichen können in unterschiedlichen UTF-x-Kodierungen unterschiedliche Darstellungen enthalten. Zum Beispiel können UTF-8-Sequenzen bis zu 6 Bytes umfassen, während UTF-16-Sequenzen höchstens 4 Bytes lang sind, obwohl beide denselben Zeichensatz (Unicode) codieren. Feinere Codierungen (UTF-8) verwenden mehr Bits, um die Sequenzlänge anzugeben. Daher sind codierte Werte für hohe Codepunkte länger und weniger optimal.
Die Antwort von dsolimano erklärt das Verhalten Ihrer Muschel.