====== 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.
''[[lyx_-_programmiersprache:units:unicode|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
→ [[lyx_-_programmiersprache:units:text|std.text]] · [[lyx_-_programmiersprache:units:unicode|std.unicode]] · [[lyx_-_programmiersprache:units|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'' → ''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 (''[[lyx_-_programmiersprache:units:unicode|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