Der gestrichelte Kreis kam nicht aus der Schrift
In etwa jedem dritten Vers stand ein Punkt in einem gestrichelten Kreis, wo keiner hingehört. Ich habe zuerst die Schriftart verdächtigt. Sie war unschuldig.
- Typografie
- HarfBuzz
- Unicode
- React Native
Ein Koran-Reader hat eine Aufgabe, die kein A/B-Test entscheidet: Der Text muss exakt so aussehen wie im gedruckten Buch. Ein zusätzliches Zeichen ist dort kein Schönheitsfehler, sondern ein Fehler im Text.
In der App stand ein gestrichelter Kreis mit einem Punkt darin mitten in Versen. Nicht überall, aber häufig genug, dass es sofort auffiel.
Die naheliegende und falsche Erklärung
Ein Zeichen, das dort steht, wo keines sein sollte, sieht nach einer unvollständigen Schriftart aus. Fehlt einer Schrift ein Zeichen, zeigt sie normalerweise ein Ersatzzeichen: ein leeres Rechteck.
Also habe ich die Zeichentabelle der Schrift geprüft. Alle koranischen Zeichen waren enthalten. Die Erklärung stimmte nicht.
Woher der Kreis wirklich kommt
Das Zeichen ist U+25CC, der gepunktete Kreis. Es ist kein Zeichen der Schrift, sondern eine Konvention: Sie zeigt, wo ein Kombinationszeichen sitzen würde, wenn es einen Buchstaben zum Kombinieren hätte.
Gesetzt wird es nicht von der Schrift und nicht von der App, sondern vom Textformer, der aus Zeichen Glyphen macht. Beginnt ein Formungslauf mit einem Kombinationszeichen, stellt er diesen Kreis als Träger davor. Aus Sicht des Formers ist das hilfreich: Er zeigt an, dass hier ein Zeichen ohne Bezugspunkt steht.
Warum der Lauf überhaupt so beginnt
Der Text stammt aus einer öffentlichen Quelle in der Uthmani-Schreibweise. Dort stehen die Pausenzeichen als eigene, durch Leerzeichen getrennte Wörter im Text. Im Vers 2:2 etwa steht zwischen zwei Wörtern ein solches Zeichen allein.
Solange der ganze Vers als ein durchgehender Text gesetzt wird, passiert nichts: Der Formungslauf beginnt mit einem Buchstaben, das Pausenzeichen steht mittendrin, alles ist gut.
Die App zerlegt den Vers aber an drei Stellen in einzelne Wörter: für die Wort-Synchronisation beim Mitlesen, für die Ersatzdarstellung des Mushaf und für den Lückentest beim Auswendiglernen. Jedes Wort wird ein eigener Textknoten, also ein eigener Formungslauf. Und einer davon beginnt dann mit dem allein stehenden Pausenzeichen.
Der Kreis war also kein Fehler in den Daten und keiner in der Schrift. Er war die korrekte Reaktion des Formers auf eine Zerlegung, die ihm einen Lauf ohne Träger gegeben hat.
Der zweite Schaden, den dieselbe Ursache angerichtet hat
Beim Suchen nach dem Kreis ist ein zweiter Fehler aufgefallen, der viel länger unbemerkt gelaufen war.
Die Textquelle zählt ein Wort samt folgendem Pausenzeichen als ein Wort. Die Wort-Zeitstempel der Rezitationen sind auf diese Zählung bezogen. Meine Zerlegung hat schlicht an jedem Leerzeichen getrennt und damit ein Token mehr geliefert.
Die Folge: Ab dem ersten Pausenzeichen im Vers markierte die App beim Mitlesen das falsche Wort, und zwar für den Rest des Verses. Ein Fehler um eins, der genau dort anfängt, wo ein selten benutztes Zeichen steht.
// Ein allein stehendes koranisches Zeichen ist kein eigenes Wort.
// Es gehört an das Wort davor: dorthin, wo auch die Quelle es zählt.
export function splitArabicWords(text: string): string[] {
const woerter: string[] = [];
for (const token of normalisiere(text).split(/\s+/)) {
if (!token) continue;
if (istNurZeichen(token) && woerter.length > 0) {
woerter[woerter.length - 1] += " " + token;
continue;
}
woerter.push(token);
}
return woerter;
}Damit sind beide Wirkungen weg: Kein Lauf beginnt mehr mit einem Kombinationszeichen, und die Wortzählung stimmt wieder mit den Zeitstempeln überein.
Was ich bei den Schriften daraus gemacht habe
Weil die Schrift zuerst der Hauptverdächtige war, habe ich für die Aufnahme neuer Schriften ein hartes Kriterium gebaut: Ein Skript liest jede Schriftdatei byteweise und prüft, ob sie den vollständigen koranischen Zeichenvorrat abdeckt.
Fünf naheliegende Kandidaten sind daran gescheitert, mit 19 bis 24 fehlenden Zeichen. Das Ergebnis ist unbequem und eindeutig: Für die Uthmani-Schreibweise gibt es derzeit keine freie Nastaliq-Schrift, die vollständig ist. Für den südasiatischen Raum bleiben zwei andere Familien.
Auch die Zeilenmaße sind gemessen statt geschätzt: Die Zeilenhöhe kommt aus den Werten, die Android für seinen Innenabstand heranzieht, nicht aus den naheliegenden anderen. Bei mehreren Schriften liegen gestapelte koranische Zeichen außerhalb der zweiten Box, und eine zu enge Zeile schneidet sie oben ab.
Was ich mitnehme
- Wenn ein Zeichen erscheint, das niemand geschrieben hat, hat es jemand gesetzt. Meist die Schicht zwischen Text und Bild, an die man zuletzt denkt.
- Eine Zeichentabelle beweist Vorhandensein, nicht Brauchbarkeit. Wer sicher sein will, vergleicht Umrisse.
- Text an Leerzeichen zu zerlegen ist eine Annahme über die Sprache, keine neutrale Operation. In dieser Schrift war sie falsch.
- Normalisierung gehört an die Datenquelle. An der Darstellung angebracht, wiederholt sie sich mit jeder neuen Ansicht, und irgendeine vergisst man.
Belege
- Salati-Repo, Commit 427cd6c6 vom 31.07.2026
- Neu: apps/mobile/src/lib/arabicText.ts (Normalisierung, splitArabicWords, arabicClusters)
- Prüfskript: scripts/pruefe-koran-fonts.mjs, liest jede Schriftdatei byteweise
- Gegenprobe live gegen die Textquelle quran.com, Verse 2:2 und 2:5