UTF-32 - UTF-32

UTF-32 ( 32- Bit- Unicode-Transformationsformat ) ist eine Codierung mit fester Länge, die zum Codieren von Unicode- Codepunkten verwendet wird, die genau 32 Bit (vier Bytes ) pro Codepunkt verwendet (aber einige führende Bits müssen Null sein, da es viel weniger gibt als 2 32 Unicode-Codepunkte, die eigentlich nur 21 Bit benötigen). UTF-32 ist eine Codierung mit fester Länge, im Gegensatz zu allen anderen Unicode-Transformationsformaten, die Codierungen mit variabler Länge sind. Jeder 32-Bit-Wert in UTF-32 stellt einen Unicode-Codepunkt dar und entspricht genau dem numerischen Wert dieses Codepunkts.

Der Hauptvorteil von UTF-32 besteht darin, dass die Unicode-Codepunkte direkt indiziert werden (aber Buchstaben im Allgemeinen, dh " Graphencluster ", oder einige Emojis können nicht direkt indiziert werden, noch ist die Berechnung der angezeigten Breite eines Strings einfacher). Das Auffinden des N-ten Codepunktes in einer Folge von Codepunkten ist eine Operation mit konstanter Zeit . Im Gegensatz dazu erfordert ein Code variabler Länge einen sequentiellen Zugriff , um den N-ten Codepunkt in einer Sequenz zu finden. Dies macht UTF-32 zu einem einfachen Ersatz im Code, der ganze Zahlen verwendet, die um eins inkrementiert werden, um jede Position in einer Zeichenfolge zu untersuchen, wie es bei ASCII üblich ist .

Der Hauptnachteil von UTF-32 besteht darin, dass es platzineffizient ist und vier Byte pro Codepunkt verwendet, einschließlich 11 Bits, die immer Null sind. Zeichen jenseits des BMP sind in den meisten Texten relativ selten (mit Ausnahme von zB Texten mit einigen beliebten Emojis) und können bei Größenschätzungen normalerweise ignoriert werden. Damit ist UTF-32 fast doppelt so groß wie UTF-16 . Es kann bis zu viermal so groß wie UTF-8 sein, je nachdem, wie viele Zeichen in der ASCII- Untermenge enthalten sind.

Geschichte

Der ursprüngliche ISO 10646- Standard definiert eine 32-Bit- Codierungsform namens UCS-4 , in der jeder Codepunkt im Universal Character Set (UCS) durch einen 31-Bit-Wert von 0 bis 0x7FFFFFFF dargestellt wird (das Vorzeichenbit war unbenutzt und null ). Im November 2003 wurde Unicode durch RFC 3629 eingeschränkt, um den Beschränkungen der UTF-16- Codierung zu entsprechen: explizites Verbot von Codepunkten größer als U+10FFFF (und auch der hohen und niedrigen Surrogate U+D800 bis U+DFFF). Diese begrenzte Untermenge definiert UTF-32. Obwohl der ISO-Standard (ab 1998 in Unicode 2.1) "für den privaten Gebrauch reserviert" 0xE00000 bis 0xFFFFFF und 0x60000000 bis 0x7FFFFFFF hatte, wurden diese Bereiche in späteren Versionen entfernt. Da das Dokument Principles and Procedures der ISO/IEC JTC 1/SC 2 Working Group 2 festlegt, dass alle zukünftigen Zuweisungen von Codepunkten auf den Unicode-Bereich beschränkt sind, wird UTF-32 in der Lage sein, alle UCS-Codepunkte und UTF-32 darzustellen und UCS-4 sind identisch.

Analyse

Obwohl eine feste Anzahl von Bytes pro Codepunkt praktisch erscheint, ist sie nicht so nützlich, wie es scheint. Es macht das Abschneiden einfacher, aber im Vergleich zu UTF-8 und UTF-16 (beide können rückwärts nach dem zu kürzenden Punkt suchen, indem sie sich höchstens 2-4 Codeeinheiten ansehen). In der Praxis sind einige Emojis aufgrund von z. B. Emoji-ZWJ-Sequenzen (und/oder Emoji-Modifikatoren , die möglicherweise die Hautfarbe ändern ) nicht mehr ein Codepunkt, wie z. B. "👨‍🦲 Man: Glatze" und "👩‍🦰 Woman: Red Hair" und daher kann man sich bei Text nicht darauf verlassen, dass es sich um eine Liste von Symbolen handelt, von denen jedes durch einen Codepunkt dargestellt wird.

Es ist äußerst selten, dass Code den N-ten Codepunkt finden möchte, ohne zuvor die Codepunkte 0 bis N–1 zu untersuchen. XML-Parsing kann beispielsweise mit einem Zeichen nichts anfangen, ohne zuerst alle vorangehenden Zeichen zu betrachten. So kann ein ganzzahliger Index, der für jedes Zeichen um 1 erhöht wird, durch einen ganzzahligen Offset ersetzt werden, der in Codeeinheiten gemessen und bei der Prüfung jedes Zeichens um die Anzahl der Codeeinheiten erhöht wird. Dies beseitigt die wahrgenommenen Geschwindigkeitsvorteile von UTF-32.

UTF-32 macht die Berechnung der angezeigten Breite eines Strings nicht einfacher, da es auch bei einer Schriftart mit "fester Breite" mehr als einen Codepunkt pro Zeichenposition ( Zeichenkombination ) oder mehr als eine Zeichenposition pro Codepunkt geben kann (" Graphemcluster " für CJK- Ideogramme). Editoren, die sich auf Sprachen von links nach rechts und vorkomponierte Zeichen beschränken, können Codeeinheiten mit fester Größe nutzen, aber solche Editoren unterstützen wahrscheinlich keine Nicht-BMP-Zeichen und können daher genauso gut mit UTF-16 arbeiten .

Verwenden

UTF-32 wird hauptsächlich in internen APIs verwendet, bei denen die Daten einzelne Codepunkte oder Glyphen sind und keine Zeichenfolgen. Beim modernen Text-Rendering ist es beispielsweise üblich, dass der letzte Schritt darin besteht, eine Liste von Strukturen zu erstellen, von denen jede Koordinaten (x,y) , Attribute und einen einzelnen UTF-32-Codepunkt enthält, der die zu zeichnende Glyphe identifiziert. Oft werden Nicht-Unicode-Informationen in den "unbenutzten" 11 Bits jedes Wortes gespeichert.

Die Verwendung von UTF-32-Strings unter Windows (wobei wchar_t 16 Bit beträgt) ist fast nicht vorhanden. Auf Unix-Systemen werden UTF-32-Strings manchmal, aber selten, intern von Anwendungen verwendet, da der Typ wchar_t als 32 Bit definiert ist. Python- Versionen bis 3.2 können kompiliert werden, um sie anstelle von UTF-16 zu verwenden ; ab Version 3.3 werden alle Unicode-Strings in UTF-32 gespeichert, jedoch mit führenden Null-Bytes, die "je nach [Codepunkt] mit der größten Unicode-Ordinalzahl (1, 2 oder 4 Byte)" wegoptimiert werden, um alle Codepunkte dieser Größe zu erhalten . Die Programmiersprachen Seed7 und Lasso codieren alle Strings mit UTF-32, da die direkte Indizierung wichtig ist, während die Programmiersprache Julia sich mit ihrer Version 1.0 von der integrierten UTF-32-Unterstützung entfernt hat und die Sprache vereinfacht hat, um nur UTF-8-Strings zu haben (wobei alle anderen Codierungen als veraltet betrachtet und aus der Standardbibliothek ins Paket verschoben wurden) nach dem "UTF-8 Everywhere Manifesto".

Varianten

Obwohl technisch ungültig, werden die Ersatzhälften oft codiert und zugelassen. Dadurch können ungültige UTF-16 (wie Windows-Dateinamen) in UTF-32 übersetzt werden, ähnlich wie die WTF-8- Variante von UTF-8 funktioniert. Manchmal werden gepaarte Ersatzzeichen anstelle von Nicht-BMP-Zeichen codiert, ähnlich wie bei CESU-8 . Aufgrund der großen Anzahl ungenutzter 32-Bit-Werte ist es auch möglich, ungültiges UTF-8 zu erhalten, indem Nicht-Unicode-Werte verwendet werden, um UTF-8-Fehler zu codieren, obwohl es dafür keinen Standard gibt.

Siehe auch

Verweise

Externe Links