# 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

Cela 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

La 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
#### Les niveaux

Les 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

Certains 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

Des 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’attribut dir="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’attribut dir="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çage U+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'isolat U+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.