====== 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