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