Texte bidirectionnel
Certains systèmes d’écritures, tels que l’alphabet arabe et hébreu, s’écrivent de droite à gauche (Right-To-Left, RTL, en anglais). Dans ce cas, le texte commence du côté droit de la page et se termine du côté gauche, au contraire du sens d’écriture occidental de gauche à droite (Left-To-Right, LTR) des langues utilisant l’alphabet latin (telles que le français). Lorsqu’un texte LTR est mélangé avec un texte RTL dans le même paragraphe, chaque type de texte doit être écrit dans son propre sens, phénomène connu sous le nom de texte bidirectionnel.
Systèmes d’écriture
modifierCela peut devenir relativement complexe, lorsque plusieurs niveaux de citations sont utilisés. La plupart des systèmes d’écriture originaires de Moyen-Orient sont de cette nature. Par exemple, le nom hébreu Sarah (שרה) doit être épelé shin (ש), resh (ר), heh (ה) de droite à gauche.
Très peu d’écritures peuvent être écrites dans les deux sens. C’était le cas des hiéroglyphes égyptiens, où l’on employait un hiéroglyphe « tête », orientée dans le sens de lecture, marquant le début d’une ligne, et un hiéroglyphe « queue » pour marquer la fin. L’orientation des hiéroglyphes renseigne sur le sens de lecture : les figures (par exemple les oiseaux) « regardent » en effet vers le début de la ligne.
Certaines inscriptions grecques, touaregs, et runiques hongroises ont utilisé un système original, appelé boustrophédon, dans lequel le sens de lecture est inversé à chaque ligne.
Prise en charge de l’écriture bidirectionnelle
modifierLa prise en charge de l’écriture bidirectionnelle (en anglais bidirectional script support) est la capacité d’un logiciel à afficher correctement le texte bidirectionnel. Dans le jargon informatique, on abrège ce terme par BiDi ou bidi. Peu de logiciels affichent correctement les textes bidirectionnels. Certains navigateur web peuvent afficher le texte hébreu de cet article en sens inverse.
Les premiers systèmes informatiques étaient conçus pour ne prendre en charge qu’un unique sens d’écriture, en particulier le sens LTR (ainsi qu’une unique fonte basée sur l’ASCII et l’alphabet latin). L’ajout de nouveaux jeux de caractères et d’encodages a permis le support d’autres écritures de gauche à droite, mais peu aisément de droite à gauche, par exemple pour l’arabe ou l’hébreu, et le mélange des deux irréalisable. Le support bidirectionnel a permis d’utiliser les deux sens d’écriture dans une même page, voire dans un même paragraphe.
En particulier, le standard Unicode fournit des bases pour un support BiDi complet, avec des règles détaillées définissant comment doivent être enchaînés les textes de droite à gauche et de gauche à droite pour leur codage et affichage. En codage Unicode, tous les caractères sont stockés dans l’ordre d’écriture, et le logiciel trouve dans quelle direction le texte doit être affiché.
Subtilités techniques en Unicode
modifierLes niveaux
modifierLes morceaux de textes sont numérotés en fonction de leur niveau d’imbrication. Le niveau 0 est celui de l’écriture du texte dans sa langue principale depuis le début du texte, par exemple en français écrit de gauche à droite, le niveau 1 est du simple texte quand son écriture doit changer de direction (par exemple passer du français à l'arabe), possiblement embarqué à l’intérieur de texte français de niveau 0. Le niveau 2 est quand le texte embarqué à l’intérieur de texte arabe de niveau 1 s'écrit à nouveau dans la direction initiale, et ainsi de suite.
Sauf exceptions, le texte et les nombres français seront toujours d’un niveau pair ; les textes arabes (à l’exception des nombres) seront d’un niveau impair.
Par exemple, en notant par des lettres latines majuscules le texte de droite à gauche (ÉCRIT EN ARABE) et par des minuscules le texte de gauche à droite (comme du français ou du catalan écriture latine), sans tenir compte de la casse du texte réel :
Représentation mémoire | un texte ÉCRIT EN ARABE et en français |
---|---|
Types des caractères | LL-LLLLL-RRRRR-RR-RRRRR-LL-LL-LLLLLLLL |
Niveau | 00000000011111111111111000000000000000 |
Ordonnancement final | un texte EBARA EN TIRCÉ et en français |
Les caractères neutres (espaces) entre les caractères écrits dans la même direction (dans « un texte » ou dans « ÉCRIT EN ARABE » ou dans « et en français ») prennent par défaut le niveau des caractères les entourant. Quand des caractères neutres figurent entre des caractères de direction différente, ils adoptent la direction des caractères de niveau inférieur.
Caractères en miroir
modifierCertains caractères apparaissent dans leur forme miroir lorsqu’ils sont écrits de droite à gauche.
Par exemple, la parenthèse gauche U+0028
qui est interprétée par le standard Unicode comme une parenthèse ouvrante apparaît comme « ( » quand elle est résolue en tant que paire, et comme son glyphe miroir « ) », lorsqu’elle est considérée comme impaire.
Contrôle de la direction d'écriture
modifierDes marques directionnelles peuvent être ajoutées autour des caractères neutres, afin d’en changer leur effet : par exemple pour forcer un caractère à prendre une direction donnée, ou pour marquer explicitement le début et la fin d'une séquence encapsulée qui doit conserver sa direction interne propre, indépendamment de la direction du texte placé avant ou après : de tels textes encapsulés sont appelés des « isolats bidirectionnels »), le texte écrit après n'est pas altéré par le texte encapsulé (notamment les caractères pouvant être écrits en miroir, ou les ponctuations séparatrices d'éléments dans une liste dont les éléments inclus peuvent être dans des écritures différentes et ne doivent pas être réordonnés en plusieurs parties).
Alors que le sens d’écriture est le plus souvent détecté automatiquement, des marques de contrôle sont prévues afin de pouvoir changer le sens d’écriture.
- Le marqueur de gauche à droite (abrégé LRM en anglais) a le code hexadécimal
U+200E
pour indiquer la direction des caractères suivants de direction neutre (il n'a aucun effet si le caractère suivant a une autre direction bien définie ; il a le même effet que l’attributdir="ltr"
d’un élément HTML quelconque, c’est un simple indicateur suggérant la direction par défaut à adopter pour la suite. - Le marqueur de droite à gauche (abrégé RLM en anglais) a le code hexadécimal
U+200F
pour indiquer la direction des caractères suivants de direction neutre (il n'a aucun effet si le caractère suivant a une autre direction bien définie ; il a le même effet que l’attributdir="rtl"
d’un élément HTML quelconque, c’est un simple indicateur suggérant la direction par défaut à adopter pour la suite. - Les marqueurs de forçage de gauche à droite (abrégé LRO en anglais)
U+202D
et de forçage de droite à gauche (abrégé RLO en anglais)U+202E
ont le même effet, mais forcent la direction de tous les caractères qui suivent (à moins que ce texte soit interrompu par un contrôle directionnel). - Les marqueurs d’enchâssement de gauche à droite (abrégé LRE en anglais)
U+202A
et d’enchâssement de droite à gauche (abrégé RLE en anglais)U+202B
ont le même effet, mais incrémentent le niveau vers le niveau suivant ayant la parité souhaitée et le marqueur de dépilement de forçageU+202C
permet de rétablir le niveau initial avant l'enchâssement (cependant la direction de la fin du texte enchâssé avant le dépilement s'applique encore après, pour les caractères ayant une direction neutre comme s'ils faisaient partie intégrante du texte enchâssé). - Les marqueurs d’isolat de gauche à droite (abrégé LRI en anglais)
U+2066
et d’isolat de droite à gauche (abrégé RLI en anglais)U+2067
ont le même effet, mais incrémentent le niveau vers le niveau suivant ayant la parité souhaitée et le marqueur de dépilement d'isolatU+2069
permet de rétablir le niveau initial avant l'isolat (mais cette fois la direction de la fin du texte isolé ne s'applique plus pour les caractères ayant une direction neutre). Le marqueur d’isolat à direction indéterminée (abrégé FSI en anglais)U+2068
a le même effet que les deux premiers marqueurs d'isolat, mais cependant ne fournit aucune direction par défaut pour le texte inclus au début de l'isolat, dont la direction sera déterminée automatiquement par le premier caractère inclus ayant une direction bien définie.
Généralement, le forçage ou l'enchâssement de direction n'est pas recommandé et on lui préfère le plus souvent les isolats directionnels, notamment dans les listes d'éléments dont les écritures sont variables (ou encore pour encapsuler un texte écrit dans une langue quelconque), mais qui doivent préserver un même ordre logique pour la liste complète et pour éviter des coupures indésirables (par exemple dans des noms propres de personnes, des toponymes, des marques commerciales ou des noms d'œuvre).
Le même effet peut aussi être induit dans des textes en balisage enrichi, par exemple en HTML au moyen d'éléments comme <bdi>... </bdi>
(pour encapsuler un isolat bidirectionnel, pris en charge depuis HTML5) ou bien <bdo>... </bdo>
(pour marquer un forçage de direction au début du texte encapsulé, mais la direction induite pour le texte situé après est induite de la direction du dernier caractère visible dans le texte encapsulé; l'élément de forçage directionnel est cependant à éviter dans la plupart des cas, sauf pour les navigateurs anciens ne prenant pas en charge les isolats directionnel). L'utilisation des marques de contrôle au sein du texte n'est pas recommandé en HTML, qui leur préfère les éléments de balisage.
Voir aussi
modifierLiens externes
modifier- (en) Unicode Standards Annex #9 - The Bidirectional Algorithm
- (en) W3C guidelines on authoring techniques for bi-directional text - includes examples and good explanations
- (en) GNU FriBiDi - An implementation of the Unicode bidirectional algorithm
- (en) International Components for Unicode (ICU) contains an implementation of the bidirectional algorithm — along with other internationalization services
- (en) UCData : "Pretty Good Bidi Algorithm Library" A small and fast bidirectional reordering algorithm that works pretty good, but not necessarily compliant to the Unicode algorithm
- (en) Bidirectional Scripts in Desktop Software Working group for supporting BiDi in Free Software. Contains several links to readings and implementation regarding BiDi in computer systems.
- (en) Another Wiki about BiDi