Wo eine Zeile brechen darf: der Unicode-Algorithmus hinter jedem umbrochenen Absatz
Veröffentlicht am 1.7.2025 · 12 Min. Lesezeit · Text- & Sprach-Tools
Daniel Okonkwo — Front-end-Entwickler und Tech-Redakteur bei OneKitly
Web-Performance · Dateiformate
Anhand von 5 Quellen geprüft
Text umzubrechen, indem man an Leerzeichen zerlegt, ist in den meisten Schriftsystemen falsch, und Unicode gibt das richtige Verfahren vor: UAX #14, den Zeilenumbruchalgorithmus. Er weist jedem Codepunkt eine Umbruchklasse zu und wendet dann nummerierte Regeln auf jedes Klassenpaar an. Ein geschütztes Leerzeichen U+00A0 und ein schmales geschütztes Leerzeichen U+202F sind Klasse GL, Leim, und ein Umbruch danach ist verboten: Eine konforme Implementierung fand in cost·100·USD mit geschützten Leerzeichen null Umbruchmöglichkeiten, während die gewöhnliche Fassung zwei hat. Ein weicher Trennstrich U+00AD ist Klasse BA, dort ist der Umbruch erlaubt, und der Strich wird nur sichtbar, wenn er genutzt wird. Ein Nullbreiten-Leerzeichen U+200B ist Klasse ZW: Es erlaubt den Umbruch und zeigt nichts, so wird Text ganz ohne Leerzeichen umbrochen. Ein geschützter Bindestrich U+2011 ist Leim, während der gewöhnliche Bindestrich-Minus U+002D Klasse HY ist und einen Umbruch danach sehr wohl erlaubt. Japanisch braucht keine Leerzeichen: Jedes Ideogramm ist Klasse ID, und zwischen fast je zweien ist ein Umbruch erlaubt. Thai ist Klasse SA und hat ohne Wörterbuchanalyse gar keine.
„An Leerzeichen umbrechen“ scheitert in den meisten Schriftsystemen der Welt. UAX #14 gibt jedem Zeichen eine Zeilenumbruchklasse; wir haben unsere in Unicode 17.0.0 nachgeschlagen und eine konforme Implementierung über geschützte Leerzeichen, weiche Trennstriche, Nullbreiten-Leerzeichen, URLs, Japanisch und Thai laufen lassen.
„An Leerzeichen umbrechen“ beschreibt eine einzige Schriftfamilie
Zerlegt man am Leerzeichen, kommt ein japanischer Satz als ein einziges Token zurück: 日本語のテキストは、空白で区切らない enthält überhaupt keine Leerzeichen, das thailändische Gegenstück ebenso wenig. Beide brechen auf dem Bildschirm tadellos um, denn die Regel handelt nicht von Leerzeichen. Lässt man eine konforme Implementierung über diesen japanischen Satz laufen, meldet sie sechzehn Umbruchmöglichkeiten bei achtzehn Zeichen — eine zwischen fast jedem Paar — und weigert sich, vor dem ideographischen Komma oder dem Punkt zu brechen. Dieselbe Implementierung meldet für den Thai-Satz null, aus einem Grund, auf den wir weiter unten zurückkommen.
Der lateinische Fall ist ebenso wenig sicher. Mit gewöhnlichen Leerzeichen geschrieben, bietet cost 100 USD zwei Umbruchmöglichkeiten; mit geschützten Leerzeichen U+00A0 geschrieben, bietet es keine, und ein am Leerzeichen zerlegender Umbrecher liefert es als ein einziges langes Token, das er nicht brechen kann. Die Zeichen sehen identisch aus. Der Unterschied steckt in den Codepunkten, und jeder Umbrecher, der nur die Formen liest, erzeugt entweder eine zu lange Zeile oder einen typografisch falschen Umbruch.
UAX #14: eine Klasse je Zeichen, dann Regeln auf Paaren
Die Unicode-Zeichendatenbank enthält eine Datei LineBreak.txt, die jedem Codepunkt eine zweibuchstabige Klasse zuweist. Wir haben die aktuelle Fassung geparst — LineBreak-17.0.0.txt vom 29. Juli 2025 — und sie definiert 49 verschiedene Klassen über 3 654 Bereiche. Mit Abstand die größte ist ID, ideographisch, mit 172 561 Codepunkten; AL, gewöhnlich alphabetisch, deckt 26 954 ab; die interessanten sind winzig: GL mit 41 Codepunkten, QU mit 39, WJ mit 2 und ZW mit genau 1. Der Algorithmus durchläuft dann die Zeichenkette und schlägt für jedes benachbarte Klassenpaar eine Regel nach.
Die Regeln sind nummeriert und in zwei Gruppen geteilt. Eine Handvoll ist nicht anpassbar: Eine Implementierung darf sie nicht ändern und weiter Konformität beanspruchen. Der Rest, ab LB12a, ist ein vernünftiger Standard, den eine Implementierung verbessern darf. LB12 verbietet einen Umbruch nach Leim. LB13 verbietet einen vor schließender Klammer, Ausrufezeichen, Schrägstrich und der Klasse schließender Interpunktion, selbst nach Leerzeichen. LB18 erlaubt einen Umbruch nach einem Leerzeichen. LB21 verbietet einen vor einem Bindestrich oder einem Break-After-Zeichen. Widersprechen sich Paare, gewinnt die Regel mit der niedrigsten Nummer — deshalb ist die Spezifikation eine Liste und keine Tabelle.
Fünf unsichtbare Zeichen, die entscheiden, wo Zeilen fallen
Das geschützte Leerzeichen und das schmale geschützte Leerzeichen sind beide Klasse GL. Sie belegen Breite und verbieten den Umbruch, was eine Zahl bei ihrer Einheit und eine Anrede bei ihrem Namen hält. Der Wortverbinder U+2060 ist Klasse WJ und geht weiter: kein Umbruch davor und keiner danach, und er hat gar keine Breite. Das Nullbreiten-Leerzeichen U+200B ist das Gegenteil: Klasse ZW, keine Breite, Umbruch erlaubt. Und der weiche Trennstrich U+00AD ist Klasse BA, ein Break-After-Zeichen, das nichts darstellt, bis der Umbruch genutzt wird — dann liefert die Darstellung einen Trennstrich.
Der Lauf mit dem weichen Trennstrich macht das Verhalten greifbar. Wir nahmen ein 63 Zeichen langes deutsches Kompositum und fügten fünf weiche Trennstriche ein: gespeicherte Länge 68, sichtbare Länge 63. Bei Breite 99 erscheint es als ein ungebrochenes Wort aus 63 Zeichen. Bei Breite 30 steht es auf drei Zeilen, bei Breite 20 auf vier, und der Trennstrich erscheint nur am Ende jeder gebrochenen Zeile — nie in der Mitte. Entfernt man die weichen Trennstriche, kommt dasselbe Wort bei Breite 20 als eine einzige 63 Zeichen lange Zeile zurück, die überläuft, weil der Algorithmus nirgends brechen darf.
Derselbe Kniff rettet Schriften, die der Algorithmus allein nicht segmentieren kann. Thai ist Klasse SA, komplex kontextabhängig, und UAX #14 sagt unmissverständlich, dass Folgen dieser Zeichen morphologische Analyse erfordern, dass sonst keine Umbruchmöglichkeiten gefunden werden und dass eine Implementierung ohne solche Analyse sie als gewöhnliche Buchstaben behandeln sollte. Unsere Implementierung meldete null Möglichkeiten in einem 23 Zeichen langen Thai-Satz. Das Einfügen dreier Nullbreiten-Leerzeichen an den Wortgrenzen ergab genau drei — unsichtbar im dargestellten Text, entscheidend für den Umbruch.
URLs brechen an Stellen, die du nicht gewählt hast
Gibt man dem Algorithmus eine URL, ist die Antwort interessanter als „nirgends“ oder „überall“. Unsere Testadresse ergab sieben Umbruchmöglichkeiten: nach dem doppelten Schrägstrich, nach jedem einzelnen Schrägstrich, nach jedem Bindestrich im Pfad und nach dem Fragezeichen. Nie vor einem Schrägstrich — LB13 verbietet das rundweg, selbst nach einem Leerzeichen — und nie an den Punkten des Hostnamens, denn der Punkt ist Klasse IS, und LB15d verweigert einen Umbruch davor. Das Ergebnis: Eine umbrochene URL behält ihre Trennzeichen am Zeilenende, wo eine Leserin sieht, dass die Zeile weitergeht.
Die Gefahr liegt darin, was du mit diesem Umbruch tust. Ein weicher Umbruch ist eine Darstellungsentscheidung: Die Zeichenkette im Speicher bleibt unverändert, und ein Neuumbruch bei anderer Breite verschiebt den Umbruch einfach. Ein harter Umbruch fügt ein echtes Zeilenendezeichen in die Daten ein. Wir haben die Test-URL hart bei 24 Spalten umbrochen; fügt man die Zeilen ohne Zwischenzeichen zusammen, kommt die URL byteweise zurück, fügt man sie mit einem Leerzeichen zusammen — was ein Mailprogramm, eine Chat-App oder ein unachtsames Kopieren tun wird —, entstehen vier durch Leerzeichen getrennte Fragmente, und der Link ist tot. Brich nie hart um, was ein einziges Token bleiben muss.
Harter Umbruch zerstört den Neuumbruch — gemessen
Wir haben einen Absatz bei 32 Spalten umbrochen, das Ergebnis mit echten Zeilenumbrüchen gespeichert und ihn dann bei 20 neu umbrochen, ohne ihn zuvor zu entfalten. Heraus kamen sieben Zeilen, mehrere davon weit kürzer als 20 Zeichen, weil jede harte Zeile isoliert neu umbrochen wurde und die ausgefransten Enden nicht gefüllt werden konnten. Entfaltet man zuerst — verbindet die Zeilen wieder mit einem Leerzeichen — und bricht dann bei 20 um, ergeben sich fünf volle Zeilen. Dieser Unterschied ist der Preis des harten Umbruchs: Der Text weiß nicht mehr, welche Zeilenenden vom Autor und welche vom vorigen Renderer stammten.
Daher stammt auch die berühmte feste Breite der E-Mail, und die Zahl, die man zitiert, ist nicht die aus der Spezifikation. RFC 5322 sagt, jede Zeile MUSS höchstens 998 Zeichen haben und SOLL höchstens 78 haben, ohne CRLF; die 998 gibt es, weil Transportimplementierungen mehr als 1 000 Zeichen pro Zeile ablehnen, und die 78, weil Anzeigesoftware alles Längere verstümmelt. RFC 3676, die format=flowed definiert, wiederholt die 78 und erklärt, dass es nicht 79 oder 80 sind, weil die letzte Spalte oft für eine Umbruchmarkierung reserviert ist. Die 72, die Mailprogramme tatsächlich verwendeten, sind eine Konvention obendrauf, die Platz für mehrere Ebenen von Zitatzeichen in Antworten lässt.
Format=flowed ist der Kompromiss, der Mail mit fester Breite erträglich machte: Eine Zeile, die vor ihrem CRLF mit einem Leerzeichen endet, ist ein weicher Umbruch, den die Leseseite neu umbrechen darf, während eine Zeile ohne dieses Leerzeichen die des Autors ist. Für ein Programm, das nie davon gehört hat, ist es gewöhnlicher Text, für eines, das es kennt, neu umbrechbarer. Die allgemeine Lehre reicht über E-Mail hinaus: Speichere den Absatz, nicht die Zeilen, und lass den letzten Renderer entscheiden, wo die Umbrüche fallen.
Was CSS ändern lässt und was nicht
CSS Text Level 3 legt den Algorithmus über fünf Eigenschaften offen, und ihre genauen Wertemengen sind es wert, gekannt zu werden. white-space nimmt normal, pre, nowrap, pre-wrap, break-spaces oder pre-line und ist standardmäßig normal. word-break nimmt normal, keep-all, break-all oder break-word. line-break nimmt auto, loose, normal, strict oder anywhere und steuert, wie streng der Algorithmus auf ostasiatische Interpunktion angewandt wird. hyphens nimmt none, manual oder auto, standardmäßig manual. overflow-wrap nimmt normal, break-word oder anywhere. Die Spezifikation nennt UAX #14 ausdrücklich als Quelle der zugrunde liegenden Klassen.
Zwei Einzelheiten in dieser Liste geraten leicht durcheinander. Da hyphens standardmäßig manual ist, werden weiche Trennstriche in deinem Text ganz ohne CSS beachtet — und hyphens: none unterdrückt sie, doch die Spezifikation sagt ausdrücklich, dass dies die Umbruchmöglichkeiten sichtbarer Zeichen wie U+002D und U+2010 nicht unterdrückt. Und overflow-wrap: anywhere ist ein letztes Mittel, keine Lösung: Es erlaubt einen Umbruch an jedem beliebigen Zeichen, wenn ein Wort sonst überliefe — beim 63 Zeichen langen Kompositum oben also mitten in einem Morphem, wo ein weicher Trennstrich einen korrekten Umbruch geliefert hätte.
Typografische Leerzeichen sind keine Verzierung
Die französische Interpunktion ist der klarste Beleg dafür, dass diese Codepunkte echte Arbeit leisten. Wir haben denselben französischen Satz zweimal umbrochen: einmal mit gewöhnlichen Leerzeichen überall, einmal mit den korrekten schmalen geschützten Leerzeichen vor der hohen Interpunktion und einem geschützten Leerzeichen vor der Einheit. Die erste Fassung bot vierzehn Umbruchmöglichkeiten, darunter eine zwischen einer Zahl und ihrer Tausendergruppe und eine vor einem schließenden Guillemet. Die zweite bot neun, und keine davon trennte ein Zeichen von seinem Wort. Gleicher sichtbarer Text, andere Menge zulässiger Zeilenumbrüche.
Dieselbe Überlegung reicht weit über das Französische hinaus. Eine Zahl und ihre Einheit, eine Abkürzung und der folgende Name, eine Ziffer und ein Prozentzeichen, eine Ordnungszahl und ihr Substantiv: All das liest sich schlecht, wenn ein Zeilenumbruch dazwischenfällt, und all das löst ein unsichtbares Zeichen statt einer Regel im Umbrecher. Unser Umbruchwerkzeug lässt diese Zeichen unangetastet, das einzig korrekte Verhalten: Sie wegzuputzen, wie es ein naiver Leerzeichen-Normalisierer tut, gibt dem Renderer stillschweigend die Erlaubnis, dort zu brechen, wo der Autor es verboten hatte.
| Zeichen | Codepunkt | Klasse | Umbruch danach? | Sichtbar? |
|---|---|---|---|---|
| Leerzeichen | U+0020 | SP | Ja | Ja, als leere Breite |
| Geschütztes Leerzeichen | U+00A0 | GL | Nein | Ja, als leere Breite |
| Schmales geschütztes Leerzeichen | U+202F | GL | Nein | Ja, schmaler |
| Bindestrich-Minus | U+002D | HY | Ja | Immer |
| Geschützter Bindestrich | U+2011 | GL | Nein | Immer |
| Weicher Trennstrich | U+00AD | BA | Ja | Nur wenn der Umbruch genutzt wird |
| Nullbreiten-Leerzeichen | U+200B | ZW | Ja | Nie |
| Wortverbinder | U+2060 | WJ | Nein, und davor auch nicht | Nie |
| Schrägstrich in einer URL | U+002F | SY | Ja danach, nie davor (LB13) | Immer |
| CJK-Ideogramm | U+4E00 und 172 560 weitere | ID | Ja, zwischen fast je zweien | Immer |
| Thai-Buchstabe | U+0E01 | SA | Nur mit Wörterbuchanalyse | Immer |
Häufige Fragen
- Warum bricht mein Text mitten in einer Zahl um?
- Weil der Gruppentrenner ein gewöhnliches Leerzeichen ist, Klasse SP, und Regel LB18 nach jedem Leerzeichen einen Umbruch erlaubt. Ersetze es durch ein geschütztes Leerzeichen U+00A0 oder ein schmales geschütztes Leerzeichen U+202F, beide Klasse GL, und die Möglichkeit verschwindet: Unser französischer Satz ging mit den typografischen Leerzeichen von vierzehn Umbruchmöglichkeiten auf neun zurück, und keine der neun fiel in eine Zahl.
- Was ist der Unterschied zwischen weichem Trennstrich und Nullbreiten-Leerzeichen?
- Beide erlauben einen Umbruch, und beide sind unsichtbar, bis sie genutzt werden — aber der weiche Trennstrich U+00AD hinterlässt beim Umbruch einen Trennstrich, das Nullbreiten-Leerzeichen U+200B hinterlässt nichts. Nimm den weichen Trennstrich innerhalb eines Wortes, wo ein Trennstrich die richtige Typografie ist; nimm das Nullbreiten-Leerzeichen zwischen Einheiten, die keinen Trennstrich bekommen dürfen, etwa Teilen eines langen Bezeichners oder einer URL, und in Schriften, die nie trennen.
- Soll ich Text hart bei 72 oder 80 Zeichen umbrechen?
- Nur wenn ein Protokoll es verlangt. RFC 5322 setzt eine harte Grenze von 998 Zeichen pro Zeile und eine Empfehlung von 78; die 72, die Mailprogramme verwendeten, lassen Platz für Zitatzeichen in Antworten und sind eine Konvention, keine Spezifikation. Harter Umbruch kostet den Neuumbruch: Einen bereits hart bei 32 Spalten umbrochenen Absatz bei 20 neu umzubrechen ergab sieben ausgefranste Zeilen gegenüber fünf vollen, wenn wir ihn zuerst entfalteten.
- Wie verhindere ich, dass eine lange URL ihren Container überläuft?
- Nicht durch das Einfügen von Zeilenumbrüchen. Der Algorithmus bietet ohnehin Umbrüche nach dem doppelten Schrägstrich, nach jedem Schrägstrich und nach jedem Bindestrich — sieben Möglichkeiten in unserer Testadresse —, ein weicher Umbruch genügt also meist. Ist der Container schmaler als die längste unbrechbare Folge, setz für dieses Element overflow-wrap: anywhere oder fügen Nullbreiten-Leerzeichen ein, die beim Kopieren nichts kosten. Eine hart umbrochene und mit einem Leerzeichen wieder zusammengefügte URL ist keine URL mehr.
- Weiß der Algorithmus, wo thailändische Wörter enden?
- Nein, und UAX #14 sagt das auch. Thailändische, laotische und Khmer-Zeichen sind Klasse SA, komplex kontextabhängig, und der Anhang stellt fest, dass ihre Folgen morphologische Analyse erfordern, dass sonst keine Umbruchmöglichkeiten gefunden werden und dass eine Implementierung ohne solche Analyse sie als gewöhnliche Buchstaben behandeln sollte. Unsere konforme Implementierung fand in einem 23 Zeichen langen Thai-Satz null Möglichkeiten und genau drei, nachdem drei Nullbreiten-Leerzeichen eingefügt waren.
Artikel, die dich interessieren könnten
Alle Ratgeber →Ähnliche Tools
Quellen
- Unicode Consortium — Unicode Standard Annex #14: Unicode Line Breaking Algorithm — line break classes and rules LB1–LB31
- Unicode Consortium — LineBreak.txt in the Unicode Character Database — the authoritative class for every code point (17.0.0, 2025-07-29)
- W3C — CSS Text Module Level 3 — white-space, word-break, line-break, hyphens and overflow-wrap
- IETF (RFC Editor) — RFC 5322 — Internet Message Format, section 2.1.1 Line Length Limits (998 characters MUST, 78 SHOULD)
- IETF (RFC Editor) — RFC 3676 — The Text/Plain Format and DelSp Parameters (format=flowed)
Hast du einen Fehler in diesem Artikel entdeckt?