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.grapheme und 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