Unicode-Zeilenumbruch-Algorithmus

Der Unicode-Zeilenumbruch-Algorithmus (englisch Unicode Line Breaking Algorithm) ist der vom Unicode-Konsortium veröffentlichte Algorithmus für den Zeilenumbruch. Dieser Algorithmus entscheidet darüber, an welchen Stellen ein Umbruch verpflichtend, an welchen möglich und an welchen verboten ist.

Geschichte

Autoren des Algorithmus sind Asmus Freytag und Andy Heninger. Der erste Entwurf wurde am 19. Mai 1998 veröffentlicht.[1] Zum Stand September 2012 liegt der Algorithmus in der Version 30 vor.[2]

Anwendungsbereich

Der Algorithmus führt nicht den eigentlichen Zeilenumbruch durch, sondern legt nur die Stellen fest, an denen ein Umbruch möglich ist, und lässt offen, wie aus diesen Informationen dann der tatsächliche Umbruch vorgenommen wird. Es werden allerdings zwei mögliche Algorithmen zur Auswahl der Umbruchstellen genannt: Zum einen das einfache Vorgehen, immer die spätestmögliche Stelle zu wählen, zum anderen das in TeX implementierte komplexe Verfahren, das die Umbrüche global zu optimieren versucht. Auch an den Umbruch anschließende Notwendigkeiten wie der Ausgleich von Wortabständen im Blocksatz werden erwähnt, sind aber nicht Bestandteil des Algorithmus.

Ebenfalls außerhalb des Anwendungsbereichs liegt die automatische Silbentrennung. Diese kann aber einfach dadurch vorgenommen werden, dass vor Anwendung des Algorithmus an den entsprechenden Stellen automatisch bedingte Trennstriche eingefügt werden.

Das Standardverhalten des Algorithmus ist vor allem für westliche Schriftsysteme ausgelegt, lässt sich jedoch durch eine angepasste Konfiguration beeinflussen. Für einige Schriften, etwa das Thailändische, die keine Leerzeichen verwenden und einen Umbruch bei Sprachsilben erfordern, lässt sich der Algorithmus nicht einsetzen.[3]

Auch durch höhere Protokolle kann der Algorithmus beeinflusst werden, beispielsweise HTML, wo das <pre>-Tag einen Umbruch verhindert oder die entsprechende CSS-Eigenschaft white-space.

Algorithmus

Jedem Unicode-Zeichen wird eine LineBreak-Eigenschaft zugewiesen, die sein Verhalten beim Umbruch beschreibt.[4]

Es gibt sehr viele mögliche Werte, die diese Eigenschaft annehmen kann. Einige dieser Werte decken große Zeichenklassen ab, einige kommen nur bei einem einzigen Zeichen vor, um Spezialfälle abzudecken. So haben beispielsweise sowohl der Zeilenvorschub und der Wagenrücklauf einen speziellen Wert, damit beide Zeichen für sich alleine einen Zeilenumbruch erzeugen, ihre Kombination aber ebenfalls nur einen Umbruch ergibt, um die verschiedenen Konventionen für das Zeilenende zu berücksichtigen. Ein weiteres Beispiel für ein Zeichen mit einer eigenen Klasse ist das Bindestrich-Minus (U+002D), das in den meisten Fällen den orthografischen Bindestrich repräsentiert (z. B. Textverarbeitung), nur nicht im numerischen Kontext, wo es als Minus interpretiert wird (z. B. Tabellenkalkulation).

Gewöhnliche Buchstaben und Ziffern gehören dabei einer Klasse an, die einen Umbruch verhindert, falls das Zeichen dadurch von einem anderen Zeichen derselben Klasse getrennt würde. Klassen, die einen Umbruch nach dem betreffenden Zeichen erlauben, enthalten unter anderem verschiedene Leerzeichen und Bindestriche. Satzzeichen, die Sätze oder Satzteile beenden, gehören Klassen an, die einen Umbruch vor dem Zeichen verhindern. Dies ist auch bei kombinierenden Zeichen der Fall. Satzzeichen für den Satzanfang, also öffnende Klammern oder die im Spanischen verwendeten umgedrehten Frage- und Ausrufezeichen, gehören dagegen zu einer Klasse, die einen Umbruch nach dem Zeichen verhindert.

Klassen, die einen Umbruch sowohl vor als auch nach dem Zeichen verhindern, existieren für geschützte Leerzeichen und Bindestriche, aber auch für Anführungszeichen. Zwar könnte man vor öffnenden und nach schließenden Anführungszeichen umbrechen, da diese aber in verschiedenen Sprachen unterschiedlich verwendet werden, ist es wesentlich einfacher, alle Umbrüche zu verhindern.

Umgekehrt besteht etwa bei chinesischen Schriftzeichen sowohl vor als auch nach dem Zeichen eine Umbruchmöglichkeit.

Ausgehend von dieser Eigenschaft ermittelt der Algorithmus für jede Stelle, ob ein Umbruch stattfinden muss, darf oder verboten ist. Es kommt dabei jeweils das erste Kriterium zur Anwendung, das passt. Die meisten dieser Regeln legen fest, an welchen Stellen kein Umbruch erfolgen soll, die letzte Regel erlaubt dann den Umbruch an allen Stellen, die nicht in einer anderen Regel ausgeschlossen wurden.

Die Reihenfolge, in der diese Regeln getestet werden, spielt dabei eine entscheidende Rolle. So steht etwa die Regel, dass vor dem Ausrufezeichen kein Umbruch erfolgen darf, vor der Regel, dass nach Leerzeichen ein Zeilenumbruch möglich ist, um die Verwendung des Leerzeichens im Französischen an dieser Stelle ohne einen unerwünschten Umbruch zu ermöglichen.

Implementierung

Der Algorithmus gibt keine spezielle Implementierung vor, solange das Ergebnis korrekt ist. Um dies zu überprüfen, stehen umfangreiche Testdateien zur Verfügung.[5] Da die meisten der Regeln nur die beiden Zeichen vor und nach dem möglichen Umbruch betrachten, nicht aber die weitere Umgebung, bieten sich Implementierungen an, die im Wesentlichen in einer Tabelle nachschlagen, ob an einer Stelle ein Umbruch erlaubt ist oder nicht und nur für die komplexeren Regeln den umgebenden Kontext untersuchen.

Neben der Implementierung des ICU-Projekts, die auch einige sprachspezifische Anpassungen beinhaltet,[6] existieren auch viele weitere, etwa als Perl-Modul.[7]

Da der Algorithmus weitreichende Anpassungen des Standardverhaltens erlaubt, können Anwendungsprogramme stark von den Vorschlägen abweichen, ohne deswegen den Standard zu verletzen. So hält sich etwa der Internet Explorer sehr eng an die Standardregeln,[8] während Mozilla Firefox stark davon abweicht.[9]

Weblinks

Einzelnachweise

  1. Version 0.3 des Unicode Line Breaking Algorithm
  2. Version 30 des Unicode Line Breaking Algorithm
  3. Determining Line Break Opportunities, Unicode Line Breaking Algorithm
  4. LineBreak.txt
  5. LineBreakTest.txt
  6. Boundary Analysis im ICU User Guide, abgerufen am 20. September 2012
  7. Unicode::LineBreak im CPAN
  8. Jukka Korpela: Word division in IE and other notes on the nobr markup, abgerufen am 20. September 2012
  9. Bug 56652 im Bug-Tracker von Mozilla, abgerufen am 20. September 2012