UTF-32

UTF-32 (32-bisschen Unicode -Transformationsformat) ist eine Codierung mit fester Länge, mit der Unicode codiert wird Codepunkte Das verwendet genau 32 Bit (vier Bytes) pro Codepunkt (aber eine Reihe von führenden Bits muss Null sein, da es weit weniger als 2 gibt32 Unicode -Codepunkte, die tatsächlich nur 21 Bit benötigen).[1] UTF-32 ist eine Codierung mit fester Länge im Gegensatz zu allen anderen Unicode-Transformationsformaten, bei denen es sich um Codierungen der variablen Länge handelt. Jeder 32-Bit-Wert in UTF-32 repräsentiert einen Unicode-Codepunkt und entspricht genau dem numerischen Wert dieses Codepunkts.

Der Hauptvorteil von UTF-32 besteht darin, dass die Unicode-Codepunkte direkt indiziert sind. Finden der Nth Codepunkt in einer Abfolge von Codepunkten ist a konstante Zeit Betrieb. Dagegen a Code variabler Länge erfordert lineare Zeit zählen N Codepunkte vom Beginn der Zeichenfolge. Dies macht UTF-32 zu einem einfachen Ersatz in Code, der Zahlen verwendet, die von einem erhöht werden, um jeden Ort in einer Zeichenfolge zu untersuchen ASCII. Abgesehen von dem Konvertieren des alten Code ist dieser konstante Zeitzugriff weitaus weniger vorteilhaft als Anfängerprogrammierer annehmen.

Der Hauptnachteil von UTF-32 besteht Bytes pro Codepunkt, einschließlich 11 Bit, die immer Null sind. Charaktere jenseits der Bmp sind in den meisten Texten relativ selten (mit Ausnahme von Texten mit einigen beliebten Emojis) und können typischerweise für Größenschätzungen ignoriert werden. Dies macht UTF-32 nahe doppelt so groß wie von UTF-16. Es kann bis zu viermal so groß sein wie UTF-8 je nachdem, wie viele der Charaktere in der sind ASCII Teilmenge.

Geschichte

Das Original ISO/IEC 10646 Standard definiert einen 32-Bit Codierungsform genannt UCS-4, in dem jeder Code in der Universeller Charakter -Set (UCS) wird durch einen 31-Bit-Wert von 0 bis 0x7fffffff dargestellt (das Vorzeichenbit war ungenutzt und Null). Im November 2003 wurde Unicode durch RFC 3629 eingeschränkt, um den Einschränkungen des UTF-16 Codierung: explizit verbot Codepunkte, die größer als U+10ffff sind (und auch die hohen und niedrigen Ersatz -U+D800 bis U+DFFF). Diese begrenzte Untergruppe definiert UTF-32.[2][1] Obwohl der ISO -Standard (ab 1998 in Unicode 2.1) "reserviert für den privaten Gebrauch" 0xe00000 bis 0xffffff und 0x60000000 bis 0x7fffffff[3] Diese Bereiche wurden in späteren Versionen entfernt. Weil die Prinzipien und Verfahren dokumentieren von ISO/IEC JTC 1/SC 2 Die Arbeitsgruppe 2 besagt, dass alle zukünftigen Zuordnungen von Codepunkten auf den Unicode-Bereich eingeschränkt werden. UTF-32 kann alle UCS-Codepunkte darstellen und UTF-32 und UCS-4 sind identisch.

Analyse

Obwohl eine feste Anzahl von Bytes pro Codepunkt bequem erscheint, ist sie nicht so nützlich, wie es erscheint. Es erleichtert die Kürzung, aber nicht signifikant im Vergleich zu UTF-8 und UTF-16 (Beide können nach hinten nach dem Punkt suchen, an dem Sie höchstens 2–4 Codeeinheiten betrachten können).

Es ist äußerst selten[4] Dieser Code möchte das finden Nth Codepunkt ohne zuerst berechnen zu müssen N Durch die Prüfung aller Codepunkte zwischen dieser Position und einem Ende der Zeichenfolge. Zum Beispiel alle Lalr Parser (wie für XML) muss sich alle vorherigen Codepunkte ansehen, bevor Sie mit dem n -ten Codepunkt etwas tun können. Ein Ganzzahl -Index, der für jedes Zeichen um 1 erhöht wird, kann durch einen Ganzzahlversatz ersetzt werden, gemessen in Codeeinheiten und durch die Anzahl der Codeeinheiten inkrementiert, sobald jedes Zeichen untersucht wird. Dies beseitigt den Geschwindigkeitsvorteil von UTF-32.

UTF-32 erleichtert die Berechnung der angezeigten Breite einer Zeichenfolge nicht oder zählt, wie viele "Zeichen" in der Zeichenfolge einfacher sind, da es auch bei einer Schriftart "feste Breite" mehr als einen Codepunkt pro Zeichenposition gibt (PositionCharaktere kombinieren) oder mehr als eine Zeichenposition pro Codespunkt ("Graphem Cluster "für CJK Ideografien).[4] Von modernen Benutzern mehr begegnen, sind Multi-Code-Punkte Emoji, wegen Emoji -Modifikatoren und Emoji Null-Breiten-Tischler Sequenzen,[5] Zum Beispiel sind diese beiden Emoji 3 Codepunkte: "‍ Mann: Glatze"[6] und "‍ Frau: rote Haare".[7]

Verwenden

Die Hauptverwendung von UTF-32 liegt in internen APIs, wobei die Daten einzelne Codepunkte oder Glyphen und nicht an Zeichen von Zeichen sind. Zum Beispiel ist es bei der modernen Textrendierung üblich, dass der letzte Schritt darin besteht, eine Liste von Strukturen zu erstellen, die jeweils enthält Koordinaten (x, y), Attribute und ein einzelner UTF-32-Codepunkt, der die zum Zeichnen von Glyphen identifiziert. Oft werden nicht-nicht-Unicode-Informationen in den "nicht verwendeten" 11 Bits jedes Wortes gespeichert.

Verwendung von UTF-32-Zeichenfolgen unter Windows (wo wchar_t IS 16 Bit) ist fast nicht vorhanden. Auf UNIX-Systemen werden UTF-32-Zeichenfolgen manchmal, aber selten intern von Anwendungen verwendet, aufgrund des Typs wchar_t definiert als 32 Bit. Python Versionen bis zu 3.2 können zusammengestellt werden, um sie anstelle von zu verwenden UTF-16; Aus Version 3.3 werden alle Unicode-Zeichenfolgen in UTF-32 gespeichert, aber die führenden Zero-Bytes optimiert "abhängig vom [Codepunkt] mit dem größten Unicode-Ordinal (1, 2 oder 4 Bytes)", um alle Codepunkte dieser Größe zu erzeugen .[8] Samen7[9] und Lasso Programmiersprachen codieren alle Zeichenfolgen mit UTF-32, in der Überzeugung, dass die direkte Indexierung wichtig ist, während die Julia Programmiersprache, die von der gebauten UTF-32-Unterstützung mit seiner 1.0-Version weggezogen wurde und die Sprache zu nur UTF-8-Saiten vereinfacht (mit allen anderen Codierungen, die als Vermächtnis eingestuft und aus der Standardbibliothek ausgestattet sind, um sich zu verpacken[10]) dem "UTF-8 überall Manifest" folgen.[11]

Varianten

Obwohl technisch ungültig, sind die Ersatzhälften oft codiert und zulässig. Dies ermöglicht es, dass ungültige UTF-16 (z. B. Windows-Dateinamen) in UTF-32 übersetzt werden, ähnlich wie die WTF-8 Variante der UTF-8-Werke. Manchmal werden gepaarte Ersatzstoffe anstelle von Nicht-BMP-Zeichen codiert, ähnlich wie CESU-8. Aufgrund der großen Anzahl unbenutzter 32-Bit-Werte ist es auch möglich, ungültige 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

  1. ^ a b Mapping -Code zeigt auf Unicode -Codierungsformulare§ 1: UTF-32
  2. ^ "ISO/IEC 10646: 2020". Standards.iso.org. Abgerufen 2021-10-12. Klausel 9.4: "Da Ersatzcodepunkte keine UCS-Skalarwerte sind, sind UTF-32-Codeeinheiten im Bereich 0000 D800-0000 DFFF schlecht geformt". Klausel 4.57: "[UCS -Codespace], bestehend aus den Ganzzahlen von 0 bis 10 ffff (hexadezimal)". Klausel 4.58: "[UCS-Skalarwert] Jeder UCS-Codepunkt mit Ausnahme von High-Surrogate- und Low-Surrogate-Codepunkten".
  3. ^ Der universelle Zeichensatz (UCS)
  4. ^ a b "Lassen Sie uns aufhören, Bedeutung für Codepunkte zuzuschreiben - um Faulheit zu verfolgen.". Manishearth.github.io. Abgerufen 2020-06-14. Die Leute implizieren, dass Codepunkte etwas bedeuten und dass O (1) Indexierung oder Schnitt an Codepunktgrenzen eine nützliche Operation ist.
  5. ^ "↔️ Emoji Zwj (Zero Width Joiner) Sequenzen". emojipedia.org. Abgerufen 2021-10-12.
  6. ^ "‍ Mann: kahle Emoji". Emojipedia. Abgerufen 2021-10-12.
  7. ^ "‍ Frau: Rote Haare Emoji". Emojipedia. Abgerufen 2021-10-12.
  8. ^ Löwis, Martin. "PEP 393 - Flexible String -Darstellung". python.org. Python. Abgerufen 26. Oktober 2014.
  9. ^ "Die Verwendung von UTF-32 hat mehrere Vorteile".
  10. ^ Juliasstrings/legacystrings.jl: Legacy Unicode String Typen, Juliasstrings, 2019-05-17, abgerufen 2019-10-15
  11. ^ "UTF-8 überall Manifest".

Externe Links