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
→ std.text · std.unicode · 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.graphemeundstd.unicodezusammen 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
