====== std.grapheme ====== Ein **Graphem-Cluster** ist das, was ein Mensch als //ein Zeichen// sieht: ein Grundzeichen samt seiner Kombinationszeichen, eine mit Jamo geschriebene Hangul-Silbe, eine aus zwei Regional Indicators gebaute Flagge oder eine Emoji-ZWJ-Folge. Weder die Byte- noch die Codepoint-Zahl trifft diese Vorstellung — die Graphem-Zahl tut es. import std.io; import std.text; import std.grapheme; fn main(): int64 { var t: Text := TextFromPchar("🇩🇪!"c); // Flagge (2 Regional Indicators) + "!" PrintLn(IntToStr(t.ByteLength())); // 9 PrintLn(IntToStr(t.CodepointCount())); // 3 PrintLn(IntToStr(TextGraphemeCount(t))); // 2 <- was der Nutzer zählt var g: Text := TextGraphemeAt(t, 0); PrintLn(IntToStr(g.ByteLength())); // 8 — die ganze Flagge return 0; } Die Unit setzt die **erweiterten Graphem-Cluster** nach UAX #29 (Regeln GB3–GB999) um. Die Break-Tabelle liegt in der generierten Unit ''std.unicode_gbdata''. **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]] ---- ===== Funktionen ===== ^ Signatur ^ Beschreibung ^ | ''TextGraphemeCount(t: Text): int64'' | Anzahl der Graphem-Cluster | | ''TextGraphemeByteOffset(t: Text, idx: int64): int64'' | Byte-Offset, an dem Cluster ''idx'' beginnt | | ''TextGraphemeAt(t: Text, idx: int64): Text'' | Cluster ''idx'' als eigenes ''Text'' | ===== Wann das zählt ===== Überall dort, wo eine Zahl den Nutzern gegenüber „Zeichen" heißen soll oder wo an einer Zeichengrenze geschnitten wird: * Längenbegrenzungen in Eingabefeldern und Protokollen * Kürzen mit Auslassungszeichen — ein Schnitt nach Codepoints trennt sonst den Akzent vom Buchstaben oder die Flagge in zwei Buchstaben * Cursorbewegung und Rücktaste in Editoren und TUIs * Spaltenausrichtung in Tabellenausgaben ===== Break-Klassen ===== ''std.unicode_gbdata'' ordnet jedem Codepoint eine der Klassen ''Other'', ''CR'', ''LF'', ''Control'', ''Extend'', ''ZWJ'', ''Regional_Indicator'', ''Prepend'', ''SpacingMark'', ''L'', ''V'', ''T'', ''LV'', ''LVT'' zu; ''Extended_Pictographic'' (Emoji-Basis) ist ein eigenes Merkmal. Beides wird per Bereichs-Binärsuche nachgeschlagen. Die Unit ist generiert und wird weder von Hand gepflegt noch direkt importiert. > **''std.grapheme'' und ''[[lyx_-_programmiersprache:units:unicode|std.unicode]]'' zusammen zu importieren übersetzt viel generierte Tabelle auf einmal.** Die Trennung ist Absicht: Wer nur segmentieren will, holt sich mit dieser Unit allein die Graphem-Break-Tabelle statt der deutlich größeren Normalisierungstabellen. ---- Letzte Aktualisierung: 2026-08-11