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
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 |
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→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.
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