www.wikidata.de-de.nina.az
Der Unicode Bidi Algorithmus englisch Unicode Bidirectional Algorithm kurz UBA ist der vom Unicode Konsortium veroffentlichte 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 Inhaltsverzeichnis 1 Anforderungen 2 Geschichte 3 Grundlagen 4 Algorithmus 4 1 Details 4 1 1 Absatze 4 1 2 Explizite Steuerzeichen 4 1 3 Schwache Zeichen 4 1 4 Neutrale Zeichen 4 1 5 Korrigierte Ebeneneinteilung 4 1 6 Umordnung 4 2 Hohere Protokolle 4 3 Implementierung 5 Beispiele 5 1 Beispiel 1 5 2 Beispiel 2 5 3 Beispiel 3 6 Weblinks 7 EinzelnachweiseAnforderungen BearbeitenWahrend eine Zeichenkette aus Unicode Zeichen im Speicher immer in der logischen Reihenfolge vorliegt mussen fur die Ausgabe die Teile umgekehrt werden die aus linkslaufigen Schriften stammen Dabei ist zu beachten dass Zahlen auch in linkslaufigen Texten von links nach rechts geschrieben werden Ferner mussen einige Zeichen etwa Klammern bei einer Umkehrung der Schreibrichtung gespiegelt ausgegeben werden Geschichte BearbeitenAls Autoren der gegenwartigen Formulierung des Algorithmus werden Mark Davis Aharon Lanin und Andrew Glass genannt Ursprunglich wurde der Algorithmus direkt im Unicode Standard beschrieben dann aber in einen Anhang ausgelagert Bis zur ersten offiziellen Version dieses Anhangs am 8 Februar 1999 1 hatte es immer wieder Korrekturen und weitere Anderungen am Algorithmus gegeben die folgenden Revisionen enthielten hauptsachlich Klarstellungen von ungenauen Formulierungen Erst mit der Revision 29 zu Unicode 6 3 0 wurde der Algorithmus durch einige weitere Steuerzeichen und neue Regeln umfassend erweitert Zuvor konnte es passieren dass bei Klammern eine der beiden zum Links nach Rechts Text gezahlt wurde die andere zum Rechts nach Links Text was zu einer unleserlichen Ausgabe fuhrte Ausserdem wurde die maximale Verschachtelungstiefe von 64 auf 128 verdoppelt Grundlagen BearbeitenZur Beeinflussung des Algorithmus sind mehrere bidirektionale Steuerzeichen definiert insbesondere das Links nach Rechts und das Rechts nach Links Zeichen Ausserdem wird jedem Unicode Zeichen eine Bidi Klasse Bidi Class 2 zugewiesen Diese werden in vier Kategorien unterteilt Starke Zeichen besitzen eine eindeutige Schreibrichtung Hier gibt es folgende Werte L fur Zeichen aus von links nach rechts geschriebenen Schriften also insbesondere alle lateinischen Buchstaben Auch das Links nach rechts Zeichen hat diesen Wert R fur Zeichen aus von rechts nach links geschriebenen Schriften also etwa Hebraisch Auch das Rechts nach links Zeichen hat diesen Wert Zeichen fur Arabisch Syrisch und Thaana erhalten ebenso wie das mit Unicode 6 3 eingefuhrte arabische Buchstabenzeichen abweichend davon den Wert AL Bei den sogenannten schwachen Zeichen treten die folgenden Werte auf EN fur die in Europa verwendeten indischen Ziffern ES fur Zeichen die innerhalb einer Zahl aus diesen Ziffern vorkommen konnen Plus und Minuszeichen und ET fur Zeichen die am Anfang oder Ende einer Zahl stehen konnen etwa Wahrungssymbole AN fur arabisch indische Ziffern und in solchen Zahlen verwendete Interpunktion CS fur Zeichen die sowohl europaische als auch arabische Ziffern trennen konnen etwa Punkt und Komma NSM fur kombinierende Zeichen wie Akzente die mit dem vorhergehenden Zeichen bei der Anzeige vereinigt werden BN fur Zeichen wie der bedingte Trennstrich die in der Ausgabe nicht erscheinen Ausserdem gibt es noch neutrale Zeichen mit den Werten B S WS und ON diese werden verschiedenen Whitespaces und anderen neutralen Zeichen Ausrufezeichen etc zugewiesen Schliesslich gibt es noch die expliziten Steuerzeichen diese werden unterteilt in Steuerzeichen zur Einbettung und zum Uberschreiben LRE RLE LRO RLO PDF und die Steuerzeichen zum Isolieren LRI RLI FSI PDI Die letzte Gruppe wurde mit Unicode 6 3 0 neu eingefuhrt Alle expliziten Steuerzeichen haben einen eigenen Wert fur die Bidi Klasse der mit ihrem Kurznamen ubereinstimmt Die Eigenschaft Bidi Paired Bracket Type kennzeichnet offnende und schliessende Klammern Bidi Paired Bracket gibt das jeweilige Gegenstuck an 3 Schliesslich sind einige Zeichen etwa Klammern als spiegelbar gekennzeichnet Bidi Mirrored 4 fur viele dieser Zeichen existiert auch ein Unicode Zeichen das dieses Spiegelbild darstellt Bidi Mirroring Glyph 5 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 fur die dritte Wurzel nur die Wurzel nicht aber die 3 gespiegelt werden Algorithmus BearbeitenZunachst wird der Text in Absatze zerlegt Der weitere Algorithmus behandelt die Absatze einzeln Als erstes erfolgt eine Einteilung in Ebenen Level entsprechend den expliziten Steuerzeichen und es wird fur jedes Zeichen seine Bidi Class Eigenschaft bestimmt Anschliessend wird dieser Wert schrittweise abgeandert bis schliesslich jedes Zeichen als L R EN oder AN gekennzeichnet ist Dazu werden zunachst die schwachen Zeichen angepasst Trennzeichen zwischen Ziffern werden als Ziffern behandelt europaische Ziffern die auf rechtslaufigen Text folgen werden wie dieser als L behandelt Nach den schwachen Zeichen werden schliesslich 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 geanderten Eigenschaften wird aufbauend die Ebeneneinteilung so geandert dass ausgehend von Ebene 0 Ebenen mit gerader Ordnungszahl von links nach rechts geschriebenen Text enthalten wahrend die Schreibrichtung in ungeraden Ebenen von rechts nach links geht Schliesslich erfolgt die Darstellung Dazu wird der Absatz in Zeilen aufgeteilt und der Text entsprechend den Ebenen umgeordnet Dabei werden zunachst alle Blocke der hochsten Ebene umgekehrt dann alle der zweithochsten und hochsten und so weiter bis zuletzt alle Blocke mit einer Nummer grosser als 0 umgekehrt werden Zeichen die dabei von rechts nach links geschrieben werden und gespiegelt werden konnen werden durch ihr Spiegelbild ersetzt Details Bearbeiten Absatze Bearbeiten Zerlege den Text in Absatze und wende die folgenden Schritte auf jeden Absatz einzeln an Ermittle in jedem Absatz das erste Zeichen vom Typ L R oder AL Dabei werden Zeichen innerhalb eines isolierten Bereiches ignoriert Falls ein solches Zeichen existiert und es vom Typ R oder AL ist so ist die Grundschreibrichtung linkslaufig die Ebenenzahlung beginnt bei 1 Andernfalls ist der Absatz rechtslaufig die Ebenenzahlung beginnt bei 0 Explizite Steuerzeichen Bearbeiten Speichere in einem Stapelspeicher der bis zu 128 Eintrage enthalten kann zunachst die ermittelte Grundebene als Uberschreibstatus den Wert neutral und als Isolationsstatus den Wert falsch In den folgenden Schritten werden immer wieder Eintrage in diesem Stapelspeicher gespeichert Sollte dieser voll oder die Ebenenzahlung grosser als 125 sein so wird der Eintrag verworfen Bei einem RLE bestimme die nachstgrossere ungerade Ebene und speichere sie zusammen mit dem Uberschreibstatus neutral und dem Isolationsstatus falsch Bei einem LRE bestimme die nachstgrossere gerade Ebene und speichere sie zusammen mit dem Uberschreibstatus neutral und dem Isolationsstatus falsch Bei einem RLO bestimme die nachstgrossere ungerade Ebene und speichere sie zusammen mit dem Uberschreibstatus rechts nach links und dem Isolationsstatus falsch Bei einem LRO bestimme die nachstgrossere gerade Ebene und speichere sie zusammen mit dem Uberschreibstatus links nach rechts und dem Isolationsstatus falsch Bei einem RLI bestimme die nachstgrossere ungerade Ebene und speichere sie zusammen mit dem Uberschreibstatus neutral und dem Isolationsstatus wahr Bei einem LRI bestimme die nachstgrossere gerade Ebene und speichere sie zusammen mit dem Uberschreibstatus neutral und dem Isolationsstatus wahr Ein FSI wird wie ein RLI oder ein LRI behandelt je nach Art des ersten starken Zeichens das wie bei Absatzen bestimmt wird Bei einem PDI oder PDF setze Ebene Uberschreibstatus und Isolationsstatus auf die Werte zuruck die vor dem zugehorigen Steuerzeichen RLI LRI oder FSI fur PDI und RLE LRE RLO oder LRO fur PDF galten Sollte es kein solches Zeichen geben wird das PDI oder PDF ignoriert Weise jedem anderen Zeichen das nicht vom Typ BN oder B ist die aktuelle Ebene und seine Bidi Klasse zu Sofern der Uberschreibstatus nicht neutral ist bestimmt dieser die Bidi Klasse L oder R Auch die Steuerzeichen RLI LRI FSI und PDI erhalten auf diese Art eine Ebenenzahlung wobei die drei einleitenden Steuerzeichen zur vorherigen Ebene gehoren das beendende PDI zur folgenden Die anderen expliziten Steuerzeichen werden zusammen mit den Zeichen vom Typ BN entfernt Zerlege den Absatz in Folgen aufeinanderfolgenden oder nur durch isolierte Texte getrennte Zeichen gleicher Ebene und wende die folgenden Schritte auf diese Folgen an Dabei werden Anfang und Ende der Folgen so behandelt als stunde dort jeweils ein Zeichen in der Schreibrichtung der hoheren der beiden angrenzenden Ebenen Am Anfang und am Ende des Absatzes ubernimmt die Grundebene die Rolle der anderen Ebene Schwache Zeichen Bearbeiten Andere NSM auf den Wert des vorhergehenden Zeichen oder am Anfang einer Ebene oder Isolierung wo sie sich nicht mit dem vorhergehenden Zeichen verbinden konnen zu ON Bestimme zu jeder europaischen Ziffer EN das vorhergehende starke Zeichen Ist dieses vom Typ AL so andere EN zu AN Andere AL zu R Andere EN ES EN zu EN EN EN EN CS EN zu EN EN EN und AN CS AN zu AN AN AN Andere jede Folge von ET die an ein EN grenzen zu EN Andere alle verbliebenen ES ET und CS zu ON Bestimme zu jedem EN das vorhergehende starke Zeichen Ist dieses vom Typ L so andere EN zu L Neutrale Zeichen Bearbeiten Seit Unicode 6 3 werden zunachst Klammern angepasst Zusammengehorende offnende und schliessende Klammern werden dabei einheitlich zu R oder L umgewandelt Dabei wird im Normalfall die Schreibrichtung der aktuellen Ebene gewahlt nur wenn der Inhalt und mindestens ein benachbartes Zeichen ausserhalb der anderen Richtung entspricht nehmen die beiden Klammern diese Richtung an Neutrale Zeichen werden dabei ubersprungen EN und AN werden wie R behandelt Ist gar kein starkes Zeichen innerhalb der Klammer vorhanden so werden zunachst keine Anderungen vorgenommen Andere jede Folge neutraler Zeichen die auf beiden Seiten von Zeichen desselben Typs begrenzt werden in diesen Dabei werden EN und AN wie R behandelt Andere alle verbliebenen neutralen Zeichen in die Grundschreibrichtung ab Korrigierte Ebeneneinteilung Bearbeiten Erhohe in geraden Ebenen fur Zeichen vom Typ R die Ebene um 1 fur Zeichen vom Typ EN und AN um 2 Erhohe in ungeraden Ebenen fur Zeichen vom Typ L EN und AN die Ebene um 1 Umordnung Bearbeiten Zerlege den Text in Zeilen Kehre in jeder Zeile zunachst alle Zeichenfolgen auf der hochsten Ebene um dann alle auf der hochsten und zweithochsten und so weiter bis zum Schluss alle Zeichenfolgen auf den Ebenen ab 1 umgekehrt werden Setzte kombinierende Zeichen in ungeraden Ebenen wieder hinter ihr zugehoriges Zeichen Stelle Zeichen in ungeraden Ebenen die gespiegelt werden sollen durch ihr entsprechendes Spiegelbild dar Hohere Protokolle Bearbeiten Der Algorithmus erlaubt die Beeinflussung durch hohere Protokolle Ein Beispiel hierfur ist das dir Attribut und das lt bdo gt Tag in HTML ebenso wie die unicode bidi und die direction Eigenschaften in CSS mit denen die Grundschreibrichtung festgelegt werden konnen oder auch dieselbe Wirkung wie mit den expliziten Steuerzeichen erreicht werden konnen 6 Implementierung Bearbeiten Der Algorithmus schreibt keine spezielle Implementierung vor solange das Ergebnis mit dem ubereinstimmt das man erhalt wenn man den Algorithmus streng befolgt So ist es etwa moglich zunachst zu uberprufen ob im Text uberhaupt Zeichen aus linkslaufigen Schreibsystemen vorkommen und andernfalls den Algorithmus gar nicht erst durchzufuhren Diese Variante ist unter anderem im Webbrowser Firefox implementiert 7 Ein Unicode kompatibles Programm muss den Unicode Bidi Algorithmus nicht unbedingt vollstandig implementieren So konnte eine integrierte Entwicklungsumgebung fur Programmiersprachen allen Text grundsatzlich von links nach rechts ausgeben und den UBA somit ganz ignorieren Auch ist es moglich nicht alle expliziten Steuerzeichen zu beachten Die Anderungen mit Unicode 6 3 fuhrten dazu dass altere Programme den Algorithmus nicht mehr korrekt umsetzten Beispiele BearbeitenBeispiel 1 Bearbeiten nbsp Oben rechts steht דניאל ראובן קזין נפל בעמק הירדן ז אייר תש ח 16 5 1948 בן 22 במותו Betrachtet wird folgende Bildbeschreibung Oben rechts steht דניאל ראובן קזין נפל בעמק הירדן ז אייר תש ח 16 5 1948 בן 22 במותו Die Grundschreibrichtung des Absatzes wird aus dem ersten Zeichen bestimmt und lauft von links nach rechts ohne explizite Steuerzeichen werden alle Zeichen vorlaufig der Ebene 0 zugeordnet Zunachst bestimmt man die Bidi Werte der einzelnen Zeichen zweite Zeile der folgenden Tabelle N steht dabei fur 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 Anschliessend 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 fur die Behandlung neutraler Zeichen wie R betrachtet wird werden die neutralen Zeichen zwischen R und EN zu R umgewandelt werden Hieraus ergibt sich schliesslich die angepasste Ebenenzahlung funfte 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 NL 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 NL 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 L0 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 0Fur die Darstellung wird nun zunachst die Ebene 2 in ihrer Richtung umgekehrt O b e n t ד נ י א ל ר א ו ב ן ק ח 8 4 9 1 5 6 1 ב ו Anschliessend 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 linkslaufigen 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 במותוKommen noch wie in der Bildunterschrift Zeilenumbruche innerhalb des Textes vor so wird zuerst der Umbruch vorgenommen anschliessend die Richtung umgekehrt Beispiel 2 Bearbeiten Ein biographischer Text uber Reuven Rivlin konnte anfangen mit Reuven Rivlin Name in Hebraischer Schrift geboren 1939 in Jerusalem ist seit 2014 Staatsprasident von Israel Reuven Rivlin ראובן ריבלין 1939 in Jerusalem ist seit 2014 Staatsprasident von Israel Dies fuhrt offenbar zu einer fehlerhaften Darstellung Das Geburtsjahr steht vor der hebraischen Schreibweise des Namens statt dahinter Um zu verstehen wo das Problem liegt kann man den Algorithmus von Hand durchfuhren Wie im ersten Beispiel lauft die Grundschreibrichtung des Absatzes von links nach rechts und man bestimmt wieder die Bidi Werte der einzelnen Zeichen zweite Zeile Da das nachste 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 nachsten Schritt in dem die neutralen Zeichen aufgelost werden daher wie R behandelt vierte Zeile Hieraus ergibt sich die angepasste Ebenenzahlung funfte Zeile Da die Zeichen zwischen dem hebraischen Namen und dem Geburtsjahr nun in einer ungeraden Ebene liegen ergibt sich die fehlerhafte Darstellung R i v l i n ר א ו ב ן ר י ב ל י ן 1 9 3 9 i n t 2 0 1 4 S L L L L L L N N R R R R R N R R R R R R N N N N EN EN EN EN N L L L N EN EN EN EN N L L L L L L L N N R R R R R N R R R R R R 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 L R R 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 0 1 1 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 losen fugt man direkt hinter dem hebraischen 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 geandert und auch die Zeichen zwischen dem Namen und dem Jahr damit korrekt behandelt Reuven Rivlin ראובן ריבלין 1939 in Jerusalem ist seit 2014 Staatsprasident von Israel Beispiel 3 Bearbeiten nbsp Bildschirmfoto des Beispiels einmal nach der aktuellen Form des Algorithmus oben Firefox einmal nach der alten Version unten Google Chrome Als Beispiel fur die mit Unicode 6 3 neu eingefuhrte Regelung fur Paare von Klammern soll folgender Text dienen der ein Zeichen mitsamt Codepunkt angibt Alif Zeichen ا 0627Eigentlich sollte der deutschen Bezeichnung Alif der arabische Buchstabe in Klammern folgen dahinter der Codepunkt In Browsern die noch den alten Algorithmus verwenden ergibt sich aber ein unleserliches Bild Beide Klammern sehen wie offnende aus die Reihenfolge der einzelnen Elemente ist chaotisch Auch hier gibt es nur eine Ebene mit Ebenenzahlung 0 Die Bidi Werte sind in der zweiten Zeile angegeben Da den europaischen Ziffern ein arabischer Buchstabe vorausgeht werden sie wie arabische Ziffern behandelt und dem arabischen Buchstaben anschliessend der Wert R zugewiesen Zeile 3 Nach der alten Regelung waren die neutralen Zeichen zwischen dem arabischen Buchstaben und den Ziffern als R behandelt worden die anderen als L Zeile 4 Nach der neuen Regel werden aber zunachst die Klammern separat betrachtet Ihr Inhalt ist zwar einheitlich linkslaufig aber keiner der Nachbarn hat diese Richtung Damit werden beide Klammern als L behandelt und damit auch die restlichen neutralen Zeichen Zeile 5 Die sich daraus ergebenden angepassten Ebenenzahlung sind in den Zeilen 6 und 7 angegeben A l i f Z e i c h e n ا 0 6 2 7 L L L L N N L L L L L L L N N AL N N N EN EN EN EN L L L L N N L L L L L L L N N R N N N AN AN AN AN L L L L L L L L L L L L L L L R R R R AN AN AN AN alt L L L L L L L L L L L L L L L R L L L AN AN AN AN neu 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 2 2 2 2 alt 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 2 2 2 2 neu Nach dem alten Algorithmus ergibt sich durch die wiederholten Umkehrungen und Spiegelungen dieses Bild A l i f Z e i c h e n ا 7 2 6 0A l i f Z e i c h e n 0 6 2 7 اA l i f Z e i c h e n 0 6 2 7 اNach dem neuen Verfahren kommt das erwunschte Ergebnis heraus Klammern mussen keine gespiegelt werden A l i f Z e i c h e n ا 7 2 6 0A l i f Z e i c h e n ا 0 6 2 7Weblinks BearbeitenOffizielle Formulierung des Algorithmus englisch Demonstration des Algorithmus englisch Einzelnachweise Bearbeiten Dritte Revision des UBA Funftes Feld in UnicodeData txt BidiBrackets txt Zehntes Feld in UnicodeData txt BidiMirroring txt CSS vs Markup fur bidirektionale Dokumente abgerufen am 28 Januar 2012 Documentation for BiDi Mozilla abgerufen am 28 Januar 2012 Abgerufen von https de wikipedia org w index php title Unicode Bidi Algorithmus amp oldid 224914398