Icon Ressource

[C] Grundlegende Unicode-String Funktionsbibliothek 2020-04-10

Vorwort
Diese Lib bietet ein paar einfache Funktionen zum Verarbeiten von UTF-8, UTF-16 und UTF-32. Diese Kodierungen unterstützen Unicode vollumfänglich. Nicht betrachtet werden Unicode Kodierungen wie UTF-EBCDIC oder CESU-8.
Additionell sind die Convertierungen von und zu Codepages 850 (hierzulande die Defaulteinstellung für Windows-Konsolefenster) und Windows-1252 (im westlichen Raum die Default-ANSI-Codepage unter Windows) implementiert. Wer möchte, kann hier gern mit weiteren Codepages erweitern. Das ist lediglich Fleißarbeit, da Codepages keiner Regel unterliegen, um sie programmatisch zu erstellen. Sie müssen also hardcodiert als Array in den Quellcode.

Hintergrund
Die C und C++ Standards bieten keine Möglichkeiten Unicode sinnvoll zu verarbeiten. Das beginnt bereits bei den dafür vorgesehenen Typen. Ein wchar_t wird unter Windows für die Darstellung von UTF-16 verwendet, da es dort eine Breite von 16 Bit hat. Auf *nixoiden Betriebssystemen ist ein wchar_t aber bspw. 32 Bit breit und kann dort für die Darstellung von UTF-32 genutzt werden. Die Typen char16_t und char32_t haben keine exakte Breite, sondern nur eine garantierte Breite von mindestens 16 bzw. 32 Bit (dürfen also auch breiter sein), was für das Lesen und Schreiben von Dateien prinzipiell unsinnig ist und zu inkonsistentem Code führt. Funktionen aus dem C Standard, wie c16rtomb, c32rtomb, mbrtoc16, mbrtoc32, etc. hängen von den Einstellungen der locale ab. Ob ein System überhaupt locale-Einstellungen für UTF-8 unterstützt und wie die Bezeichnungen zum Ein-/Umstellen lauten, ist implementationsabhängig. Es ist erstaunlich, wie so etwas den Einzug in Standards geschafft hat, die den Anspruch erheben, plattformunabhängig zu sein. Da Code Points für UTF-8 und UTF-16 mit unterschiedlich vielen Code Units dargestellt werden, sind andere Standardfunktionen ungeeignet, um bspw. die Anzahl von Code Points oder die Position eines Code Points in einem String zu ermitteln.

Begriffe
  • Code Point: Eine eindeutige Identifizierungsnummer für jedes in den Unicode Standard aufgenommene Zeichen.
  • Code Unit: Eine Einheit einer bestimmten Breite, um einen Code Point in einer bestimmten Codierung darzustellen. So wird ein Code Point in UTF-8 bspw. mit einem bis vier Code Units à 8 Bit Breite dargestellt. In UTF-16 sind es ein oder zwei Code Units à 16 Bit. In UTF-32 reicht eine Code Unit mit 32 Bit Breite um einen Code Point zu beschreiben, somit ist der Wert der Code Unit gleich dem Wert des Code Points.
  • Surrogate Pair: Bei UTF-16 eine Sequenz von zwei 16 Bit breiten Code Units zur Darstellung von Code Points, für die eine Breite von 16 Bit nicht mehr ausreicht. Diese Wertebereiche sind im Unicode Standard als High Surrogates bzw. Low Surrogates reserviert und dürfen selbst keine eigenständigen Zeichen repräsentieren.
  • Endianness: Die Bytereihenfolge, die zur Darstellung der Code Units verwendet wird. Für UTF-16 und UTF-32 unterscheidet man Little Endian (wobei das niedrigste Byte einer Code Unit das erste geschriebene Byte ist) und Big Endian (wobei das höchste Byte einer Code Unit das erste geschriebene Byte ist).
  • Byte Order Mark: Erste Bytesequenz in einer Unicode-kodierten Datei, die die verwendete Kodierung und/oder die Bytereihenfolge der Code Units beschreibt. Dieses Zeichen ist das Unicode Zeichen "Geschütztes Leerzeichen mit Breite Null". Der Unicode Standard erlaubt dieses Zeichen als optionales Byte Order Mark. Wird es als erstes Zeichen in einer Datei gelesen, so soll es nicht als Textinhalt gewertet werden. Da die Verwendung eines BOM zwar optional aber erlaubt ist, bedeutet das im Umkehrschluss dass Unicode-konforme Implementationen das BOM entsprechend verarbeiten können müssen. Diese Tatsache wird von Programmierern, insbesondere unter Linux, erstaunlicherweise meist immer noch ignoriert.
  • Code Page: Tabelle für die Übersetzung von Character Codes zu Code Points. Alter und hässlicher, aber noch heute gebräuchlicher Versuch, Zeichen außerhalb des ASCII Bereichs mit nur einem Byte Breite darzustellen. In ANSI Codepages sind die ersten 128 Character Codes mit den ASCII Codes identisch. Die restlichen 128 Codes sind mit, je nach Code Page, unterschiedlichen Code Points verknüpft. Codepage-codierte Textdateien enthalten keinen Hinweis auf die verwendete Code Page. Der Handshake zwischen schreibenden und lesenden Programmen fehlt also, was zu Missinterpretationen von Zeichen führt, wenn die Codepage dieser Programme nicht anderweitig synchronisiert wurde.

Inhalt der Lib
  • Funktionen zur Umkehr der Bytereihenfolge (Endianness).
  • Funktionen zur Feststellung ob die erste Bytesequenz ein Byte Order Mark ist.
  • Funktionen zur Feststellung ob der gelesene Text valide ist, der Länge in Code Units und der Größe in Bytes.
  • Funktionen zur Konvertierung von und zu UTF-32. Anmerkung: Eine direkte Konvertierung zwischen UTF-8 und UTF-16 ist nicht vorgesehen, da diese die Gefahr der Erzeugung von CESU-8 birgt. UTF-32 soll als Schnittstelle angewendet werden.
  • Funktionen zur Ermittlung eines Pointers auf einen Code Point in einem String.
  • Funktion zur Konvertierung eines Code Points.
  • Funktionen zum Vergleich von Strings.
  • Funktionen zum Kopieren von Strings.
  • Funktionen zur Verkettung von Strings.
  • Macros für die Werte des Byte Order Marks.
  • Macros für die Umrechnung zwischen Anzahl Bytes und Anzahl Code Units in einem String.

Weitere Informationen sind den Kommentaren im Header zu entnehmen.

Mögliche Ausgabe des Beispielcodes in der main.c auf Windows:
1586529405903.png
Autor
german
Downloads
248
Aufrufe
621
Erstellt am
Letzte Bearbeitung
Bewertung
0,00 Stern(e) 0 Bewertung(en)

Weitere Ressourcen von german

Oben Unten