std.unicode_case

Die vollständige einfache Groß-/Kleinschreibung von Unicode — Latin Extended, Griechisch, Kyrillisch und der Rest —, dazu caseless Vergleichen und Suchen. Grundlage ist die generierte Tabelle std.unicode_casedata aus den Feldern 12/13 von UnicodeData.txt: 1505 Groß- und 1488 Kleinbuchstaben-Zuordnungen, per Binärsuche nachgeschlagen.

std.unicode bringt mit TextToUpper/TextToLower nur die regelbasierte Abdeckung für ASCII und Latin-1 mit. Diese Unit ist die vollständige Fassung — und absichtlich getrennt: std.unicode zieht bereits die großen Normalisierungstabellen herein, beide zusammen überschreiten die Größengrenze des Compilers pro Übersetzungseinheit. Ein Programm, das nur Groß-/Kleinschreibung braucht, importiert diese Unit und bezahlt nur ihre Tabelle.

Autor: Andreas Röne
Copyright: 2024-2026 Andreas Röne

std.text · std.unicode · Standard Library


Groß- und Kleinschreibung

import std.io;
import std.text;
import std.unicode_case;

fn Zeige(t: Text): void {
    var p: pchar := t.ToPchar() as pchar;
    PrintLn(p);
}

fn main(): int64 {
    var t: Text := TextFromPchar("Ωδός Привет"c);
    Zeige(TextToUpperFull(t));    // "ΩΔΌΣ ПРИВЕТ"
    Zeige(TextToLowerFull(t));    // "ωδός привет"
    return 0;
}

Signatur Beschreibung
UnicodeToUpperFull(cp: int64): int64 Vollständige Großform eines Codepoints; unverändert, wenn es keine gibt
UnicodeToLowerFull(cp: int64): int64 Vollständige Kleinform
TextToUpperFull(t: Text): Text Über den ganzen Text
TextToLowerFull(t: Text): Text dito

Caseless vergleichen

Zum Vergleichen reicht Kleinschreiben nicht: Das griechische Schluss-Sigma ς (U+03C2) ist schon klein, ToLower lässt es also stehen — und „ΟΔΟΣ„ träfe nie auf „οδος“. Das Falten (Folding) bildet ς zusätzlich auf σ ab und räumt genau diesen Fall aus.

var a: Text := TextFromPchar("ΟΔΟΣ"c);
var b: Text := TextFromPchar("οδος"c);
PrintLn(IntToStr(TextEqualsFold(a, b)));    // 1

Signatur Beschreibung
UnicodeFoldFull(cp: int64): int64 Codepoint falten (volle Kleinform + Schluss-Sigma)
TextFoldFull(t: Text): Text Gefaltete Fassung des ganzen Textes
TextEqualsFold(a, b): int64 Vergleich ohne Rücksicht auf Groß-/Kleinschreibung
TextCompareFold(a, b): int64 Lexikografisch gefaltet: -1/0/1
TextContainsFold(t, needle): int64 Enthaltenstest ohne Rücksicht auf Groß-/Kleinschreibung
 
Das ist einfaches Falten — 1:1 pro Codepoint. Volles Falten nach UAX #44 bildet einen Codepoint auch auf mehrere ab: ßss, fi, ʼnʼn. Eine 1:1-Zuordnung kann das nicht ausdrücken, deshalb gilt hier:

TextEqualsFold(TextFromPchar("STRASSE"c), TextFromPchar("Straße"c))   // 0


Ebenso wenig entfernt Falten Akzente: „ΟΔΟΣ„ und „οδός“ bleiben ungleich. Wer Akzente ignorieren will, normalisiert zuerst nach NFD (std.unicode) und entfernt die Kombinationszeichen.

Nicht abgedeckt sind außerdem die sprachabhängigen Sonderfälle — türkisches İ/ı etwa braucht eine Gebietsschema-Regel, die diese Unit nicht kennt.

Datenunit

std.unicode_casedata ist generiert und wird nicht von Hand gepflegt oder direkt importiert. Sie enthält die 1:1-Zuordnungen aus UnicodeData.txt (Felder 12 und 13) als sortierte Schlüssel-/Wert-Felder von rund 141 KB, über die per Binärsuche gesucht wird. Eigene Unit ist sie, weil std.unicode_data mit rund 945 KB bereits nahe an der Größengrenze des Compilers liegt.


Letzte Aktualisierung: 2026-08-11