Zum Inhalt springen

Unicode-Bidi-Algorithmus

aus Wikipedia, der freien Enzyklopädie
Dies ist eine alte Version dieser Seite, zuletzt bearbeitet am 28. Januar 2012 um 10:52 Uhr durch Schnark (Diskussion | Beiträge) (Neuer Artikel über den Unicode-Bidi-Algorithmus). Sie kann sich erheblich von der aktuellen Version unterscheiden.
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)

Der Unicode-Bidi-Algorithmus (englisch Unicode Bidirectional Algorithm, kurz UBA) ist der vom Unicode-Konsortium veröffentlichte Algorithmus zur Darstellung bidirektionaler Texte, also Texte, die sowohl Zeichen von Schriften enthalten, die von links nach rechts geschrieben werden, als auch von solchen, die von rechts nach links geschrieben werden.

Anforderungen

Während eine Zeichenkette aus Unicode-Zeichen im Speicher immer in der logischen Reihenfolge vorliegt, müssen für die Ausgabe die Teile umgekehrt werden, die aus linksläufigen Schriften stammen. Dabei ist zu beachten, dass Zahlen auch in linksläufigen Texten von links nach rechts geschrieben werden. Ferner müssen einige Zeichen, etwa Klammern, bei einer Umkehrung der Schreibrichtung gespiegelt ausgegeben werden.

Geschichte

Autor des Algorithmus ist Mark Davis. Der erste Entwurf wurde am 30. Oktober 1998 veröffentlicht.[1] In dieser Version waren verschachtelte Blöcke nur bis zu einer Tiefe von 15 vorgesehen, diese Zahl wurde mit der ersten offiziellen Version am 8. Februar 1999[2] auf 61 erhöht. Zusätzlich wurden weitere Teile des Algorithmus umformuliert, ohne dabei jedoch sein Ergebnis zu ändern. Von dieser Änderung abgesehen waren die Änderungen nur Klarstellungen und kleine Ergänzugen. Derzeit (Stand Januar 2012) liegt der Algorithmus in der Version 23 vor. Für die Zukunft ist die Einführung eines weiteren Steuerzeichens geplant, aber keine stärkeren Eingriffe in den Algorithmus.[3]

Grundlagen

Zur Beeinflussung des Algorithmus sind mehrere bidirektionale Steuerzeichen definiert, insbesondere das Links-nach-Rechts- und das Rechts-nach-Links-Zeichen.

Außerdem wird jedem Unicode-Zeichen eine Bidi-Klasse (Bidi_Class[4]) zugewiesen. Diese werden in drei Kategorien unterteilt:

Starke Zeichen besitzen eine eindeutige Schreibrichtung. Hier gibt es folgende Werte:

  • L für Zeichen aus von links nach rechts geschriebenen Schriften, also insbesondere alle lateinischen Buchstaben. Auch das Links-nach-rechts-Zeichen hat diesen Wert.
  • R für Zeichen aus von rechts nach links geschriebenen Schriften, also etwa Hebräisch. Zeichen für Arabisch, Syrisch und Thaana erhalten abweichend davon den Wert AL.
  • LRE, LRO, RLE und RLO sind besondere Werte, die nur den jeweiligen Steuerzeichen zugeordnet werden.

Bei den sogenannten schwachen Zeichen treten die folgenden Werte auf:

  • EN für die in Europa verwendeten indischen Ziffern, ES für Zeichen, die innerhalb einer Zahl aus diesen Ziffern vorkommen können (Plus- und Minuszeichen) und ET für Zeichen, die am Anfang oder Ende einer Zahl stehen können, etwa Währungssymbole.
  • AN für arabische-indische Ziffern und in solchen Zahlen verwendete Interpunktion.
  • CS für Zeichen, die sowohl europäische als auch arabische Ziffern trennen können, etwa Punkt und Komma.
  • NSM für kombinierende Zeichen wie Akzente, die mit dem vorhergehenden Zeichen bei der Anzeige vereinigt werden.
  • BN für Zeichen wie das weiche Trennzeichen, die in der Ausgabe nicht erscheinen.
  • PDF für das gleichnamige Steuerzeichen.

Außerdem gibt es noch neutrale Zeichen mit den Werten B, S, WS und ON, diese werden verschieden Whitespaces und anderen neutralen Zeichen (Ausrufezeichen etc.) zugewiesen.

Ferner sind einige Zeichen (etwa Klammern) als spiegelbar gekennzeichnet (Bidi_Mirrored[5]), für viele dieser Zeichen existiert auch ein Unicode-Zeichen, das dieses Spiegelbild darstellt (Bidi_Mirroring_Glyph[6]). Bei den anderen Zeichen muss das darstellende Programm selbst ein Spiegelbild erzeugen. Spiegelbild bedeutet dabei nicht in jedem Fall ein exaktes Spiegelbild, so sollte etwa beim Zeichen für die dritte Wurzel nur die Wurzel, nicht aber die 3 gespiegelt werden.

Algorithmus

Zunächst wird der Text in Absätze zerlegt. Der weitere Algorithmus behandelt die Absätze einzeln.

Als erstes erfolgt eine Einteilung in Ebenen (Level) entsprechend der expliziten Steuerzeichen und es wird für jedes Zeichen seine Bidi_Class-Eigenschaft bestimmt. Anschließend wird dieser Wert schrittweise abgeändert, bis schließlich jedes Zeichen als L, R, EN oder AN gekennzeichnet ist. Dazu werden zunächst die schwachen Zeichen angepasst: Trennzeichen zwischen Ziffern werden als Ziffern behandelt, europäische Ziffern, die auf rechtsläufigen Text folgen, werden wie dieser als L behandelt. Nach den schwachen Zeichen werden schließlich die neutralen Zeichen umgewandelt, diese passen sich in ihrer Schreibrichtung dem umgebenden Text an. Dabei werden Ziffern – sofern sie nicht im vorherigen Schritt den Typ L erhalten haben – als R behandelt.

Auf diesen geänderten Eigenschaften wird aufbauend die Ebeneneinteilung so geändert, dass (ausgehend von Ebene 0) Ebenen mit gerader Ordnungszahl von links nach rechts geschriebenen Text enthalten, während die Schreibrichtung in ungeraden Ebenen von rechts nach links geht.

Schließlich erfolgt die Darstellung: Dazu wird der Absatz in Zeilen aufgeteilt und der Text entsprechend der Ebenen umgeordnet. Dabei werden zunächst alle Blöcke der höchsten Ebene umgekehrt, dann alle der zweithöchsten und höchsten, und so weiter, bis zuletzt alle Blöcke mit einer Nummer größer als 0 umgekehrt werden. Zeichen, die dabei von rechts nach links geschrieben werden und gespiegelt werden können, werden durch ihr Spiegelbild ersetzt.

Details

Absätze

  • Zerlege den Text in Absätze und wende die folgenden Schritte auf jeden Absatz einzeln an.
  • Ermittle in jedem Absatz das erste Zeichen vom Typ L, R oder AL.
  • Falls ein solches Zeichen existiert und es vom Typ R oder AL ist, so ist die Grundschreibrichtung linksläufig, die Ebenenzählung beginnt bei 1. Andernfalls ist der Absatz rechtsläufig, die Ebenenzählung beginnt bei 0.

Explizite Steuerzeichen

  • Speichere in einem Stapelspeicher zunächst die ermittelte Grundebene und als Überschreibstatus den Wert „neutral“.
  • Bei einem RLE bestimme die nächst größere ungerade Ebene. Falls sie maximal 61 ist, so speichere diesen Wert zusammen mit dem Überschreibstatus „neutral“.
  • Bei einem LRE bestimme die nächst größere gerade Ebene. Falls sie maximal 60 ist, so speichere diesen Wert zusammen mit dem Überschreibstatus „neutral“.
  • Bei einem RLO bestimme die nächst größere ungerade Ebene. Falls sie maximal 61 ist, so speichere diesen Wert zusammen mit dem Überschreibstatus „rechts-nach-links“.
  • Bei einem LRO bestimme die nächst größere gerade Ebene. Falls sie maximal 60 ist, so speichere diesen Wert zusammen mit dem Überschreibstatus „links-nach-rechts“.
  • Bei einem PDF setze die Ebene und den Überschreibstatus auf die Werte zurück, die vor dem zugehörigen Steuerzeichen galten.
  • Weise jedem anderen Zeichen, das nicht vom Typ BN ist, die aktuelle Ebene und seine Bidi-Klasse zu. Sofern der Überschreibstatus nicht neutral ist, bestimmt dieser die Bidi-Klasse (L oder R).
  • Entferne alle expliziten Steuerzeichen und alle Zeichen vom Typ BN.
  • Zerlege den Absatz in Folgen aufeinanderfolgenden Zeichen gleicher Ebene und wende die folgenden Schritte auf diese Folgen an. Dabei werden Anfang und Ende der Folgen so behandelt, als stünde dort jeweils ein Zeichen in der Schreibrichtung der höheren der beiden angrenzendenen Ebenen. Am Anfang und am Ende des Absatzes übernimmt die Grundebene die Rolle der anderen Ebene.

Schwache Zeichen

  • Ändere NSM auf den Wert des vorhergehenden Zeichen.
  • Bestimme zu jeder europäischen Ziffer (EN) das vorhergehende starke Zeichen. Ist dieses vom Typ AL, so ändere EN zu AN.
  • Ändere AL zu R.
  • Ändere EN-ES-EN zu EN-EN-EN, EN-CS-EN zu EN-EN-EN und AN-CS-AN zu AN-AN-AN.
  • Ändere jede Folge von ET, die an ein EN grenzen, zu EN.
  • Ändere alle verbliebenen ES, ET und CS zu ON.
  • Bestimme zu jedem EN das vorhergehende starke Zeichen. Ist dieses vom Typ L, so ändere EN zu L.

Neutrale Zeichen

  • Ändere jede Folge neutraler Zeichen, die auf beiden Seiten von Zeichen des selben Typs begrenzt werden, in diesen. Dabei werden EN und AN wie R behandelt.
  • Ändere alle verbliebenen neutralen Zeichen in die Grundschreibrichtung ab.

Korrigierte Ebeneneinteilung

  • Erhöhe in geraden Ebenen für Zeichen vom Typ R die Ebene um 1, für Zeichen vom Typ EN und AN um 2.
  • Erhöhe in ungeraden Ebenen für Zeichen vom Typ L, EN und AN die Ebene um 1.

Umordnung

  • Zerlege den Text in Zeilen.
  • Kehre in jeder Zeile zunächst alle Zeichenfolgen auf der höchsten Ebene um, dann alle auf der höchsten und zweithöchsten und so weiter, bis zum Schluss alle Zeichenfolgen auf den Ebenen ab 1 umgekehrt werden.
  • Setzte kombinierende Zeichen in ungeraden Ebenen wieder hinter ihr zugehöriges Zeichen.
  • Stelle Zeichen in ungeraden Ebenen, die gespiegelt werden sollen, durch ihr entsprechendes Spiegelbild dar.

Höhere Protokolle

Der Algorithmus erlaubt die Beeinflussung durch höhere Protokolle. Ein Beispiel hierfür ist das dir-Attribut und das <bdo>-Tag in HTML ebenso wie die unicode-bidi- und die direction-Eigenschaften in CSS, mit denen die Grundschreibrichtung festgelegt werden können oder auch die selbe Wirkung wie mit den expliziten Steuerzeichen erreicht werden können.[7]

Implementierung

Der Algorithmus schreibt keine spezielle Implementierung vor, solange das Ergebnis mit dem übereinstimmt, das man erhält, wenn man den Algorithmus streng befolgt. So ist es etwa möglich zunächst zu überprüfen, ob im Text überhaupt Zeichen aus linksläufigen Schreibsystemen vorkommen, und andernfalls den Algorithmus gar nicht erst durchzuführen. Diese Variante ist unter anderem im Webbrowser Firefox implementiert.[8]

Beispiele

Beispiel 1

Oben rechts steht: „“
Oben rechts steht: „דניאל (ראובן) קזין וםל בעמק הירדן זי אייר תעיח 16.5.1948 בן 22 בםותו“

Die Grundschreibrichtung des Absatzes wird aus dem ersten Zeichen bestimmt und läuft von links nach rechts, ohne explizite Steuerzeichen werden alle Zeichen vorläufig der Ebene 0 zugeordnet. Zunächst bestimmt man die Bidi-Werte der einzelnen Zeichen (zweite Zeile der folgenden Tabelle, N steht dabei für ein beliebiges neutrales Zeichen).

Nun werden die schwachen Zeichen, also die Ziffern behandelt (dritte Zeile). Die Punkte direkt zwischen den Ziffern werden dabei in den Typ EN verwandelt, also im weiteren Verlauf wie die Ziffern selbst behandelt. Den Ziffern geht als erstes starkes Zeichen eines vom Typ R voraus, sodass sie so belassen werden.

Anschließend kommen die neutralen Zeichen an die Reihe (vierte Zeile). Dort wo L und R zusammentreffen, werden – ebenso wie am Ende des Textes – die neutralen Zeichen zu L umgewandelt, da dies der Hauptschreibrichtung entspricht. Da Ziffern für die Behandlung neutraler Zeichen wie R betrachtet wird, werden die neutralen Zeichen zwischen R und EN zu R umgewandelt werden.

Hieraus ergibt sich schließlich die angepasste Ebenenzählung (fünfte Zeile). Ausgehend von der Ebene 0 wird Zeichen vom Typ R die Ebene 1 zugewiesen, Zeichen vom Typ EN die Ebene 2.

O b e n t : ד נ י א ל   ( ר א ו ב ן )   ק ח   1 6 . 5 . 1 9 4 8   ב ו
L L L L L N N R R R R R N N R R R R R N N R R N EN EN ES EN ES EN EN EN EN N R R N
L L L L L N N R R R R R N N R R R R R N N R R N EN EN EN EN EN EN EN EN EN N R R N
L L L L L L L R R R R R R R R R R R R R R R R R EN EN EN EN EN EN EN EN EN R R R L
0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 1 1 1 0

Für die Darstellung wird nun zuächst die Ebene 2 in ihrer Richtung umgekehrt:

O b e n t : ד נ י א ל   ( ר א ו ב ן )   ק ח   8 4 9 1 . 5 . 6 1   ב ו

Anschließend werden die Ebenen 1 und 2 gespiegelt:

O b e n t : ו ב   1 6 . 5 . 1 9 4 8   ח ק   ) ן ב ו א ר (   ל א י נ ד

Zuletzt werden die beiden Klammern im linksläufigen Text durch ihr jeweiliges Spiegelbild ersetzt:

O b e n t : ו ב   1 6 . 5 . 1 9 4 8   ח ק   ( ן ב ו א ר )   ל א י נ ד

Auf diese Weise ergibt sich die Darstellung:

Oben rechts steht: „דניאל (ראובן) קזין וםל בעמק הירדן זי אייר תעיח 16.5.1948 בן 22 בםותו“

Beispiel 2

Ein biographischer Text über Schimon Peres könnte anfangen mit:

Schimon Peres (שמעון פרס; * 1923 in Wischnewa) ist seit 2007 Staatspräsident von Israel.

Dies führt offenbar zu einer fehlerhaften Darstellung: Das Geburtsjahr steht vor der hebräischen Schreibweise das Namen, statt dahinter. Um zu verstehen, wo das Problem liegt, kann man den Algorithmus von Hand durchführen.

Wie im ersten Beispiel läuft die Grundschreibrichtung des Absatzes von links nach rechts und man bestimmt wieder die Bidi-Werte der einzelnen Zeichen (zweite Zeile). Da das nächste starke Zeichen vor dem Geburtsjahr den Wert R hat, wird hier EN nicht in L umgewandelt, im Gegensatz zu den anderen Ziffern in diesem Satz (dritte Zeile). Daher werden diese Ziffern im nächsten Schritt, in dem die neutralen Zeichen aufgelöst werden, daher wie R behandelt (vierte Zeile). Hieraus ergibt sich die angepasste Ebenenzählung (fünfte Zeile). Da die Zeichen zwischen dem hebräischen Namen und dem Geburtsjahr nun in einer ungeraden Ebene liegen, ergibt sich die fehlerhafte Darstellung.

P e r e s   ( ס ר פ   ן ו ע מ ש   ;   *   1 9 2 3   i n t   2 0 0 7   S
L L L L L N N R R R N R R R R R N N N N N EN EN EN EN N L L L N EN EN EN EN N L
L L L L L N N R R R N R R R R R N N N N N EN EN EN EN N L L L N L L L L N L
L L L L L L L R R R R R R R R R R R R R R EN EN EN EN L L L L L L L L L L L
0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0

Um dieses Problem zu lösen, fügt man direkt hinter dem hebräischen Namen ein Links-nach-rechts-Zeichen (LRM) ein. So geht den Ziffern ein Zeichen vom Typ L voraus, statt wie bisher eines vom Typ R. Daher wird der Typ der Ziffern auf L geändert und auch die Zeichen zwischen dem Namen und dem Jahr damit korrekt behandelt. Handelt es sich bei dem Text um HTML-Code, so ergibt sich auch bei der Verwendung der benannten Entität &lrm; auch im Quelltext die korrekte Darstellung, denn auch hier geht dem Jahr ein Zeichen vom Typ L (hier das m) voraus.

Schimon Peres (סרפ ןועמש‎; * 1923 in Wischnewa) ist seit 2007 Staatspräsident von Israel.

Einzelnachweise

  1. Erste Revision des UBA
  2. Dritte Revision des UBA
  3. Ankündigung der Ergebnis des UTC-Treffens # 129, 16. November 2011
  4. Fünftes Feld in UnicodeData.txt
  5. Zehntes Feld in UnicodeData.txt
  6. BidiMirroring.txt
  7. CSS vs. Markup für bidirektionale Dokumente, abgerufen am 28. Januar 2012
  8. Documentation for BiDi Mozilla, abgerufen am 28. Januar 2012

[[Kategorie:Unicode]] [[Kategorie:Typografie]] [[Kategorie:Algorithmus]]