# Séquence d'échappement

On entend par séquence d'échappement (de l'anglais escape sequence) une séquence de quelques octets et/ou de caractères présente dans un flot de texte et jouant un rôle particulier à l'endroit où elle est présente. Elle est introduite par un code prévu à cet effet, généralement le code de contrôle 0x1B ESC (pour escape). Bien que les terminaux physiques en mode texte soient devenus rares au début du XXIe siècle, les séquences d'échappement restent utilisées dans les émulateurs de terminaux, ainsi que pour l'écriture d'interface en mode semi-graphique, grâce à l'API ncurses.

## Histoire

La notion de code d'échappement a été introduite dans le code Baudot. Anecdotiquement, si l'on considère que les - sont des 1 et les + des 0, la séquence d'échappement du code Baudot est déjà la valeur 0x1B.
Le code 8 bits du DoD inclut une fonction Special dans les mêmes dispositions dès 1961.
Vers le milieu des années 1960, pratiquement tous les fabricants de terminaux vidéo les avaient pourvus en ROM de séquences d'échappement pour réaliser les opérations graphiques les plus élémentaires, à savoir effacer l'écran et déplacer le curseur à une position quelconque de l'écran. Successeurs des codes propriétaires des années 1960 (EBCDIC d'IBM notamment), les codes ANSI sont apparus dans les années 1970, et leur usage s'est répandu dans le marché informatique au début des années 1980.

## Application
### 5 bits Baudot

Dans le code Baudot, et ses variantes étrangères, la séquence 1B (-++-++) permet de représenter deux plages de caractères de cinq bits en basculant entre les messages chiffrés et les messages lettre.

### 8 bits avec ESC

Cette technologie, sous la forme des séquences d'échappement ANSI est utilisée dans différents contextes ; en particulier :
* ISO/CEI 2022 ;
* VT100 ;
* ANSI.SYS ;
Il existe au moins 157 codages de caractères différents accessibles par séquence d'échappement.
À titre d'exemple, la table ci-dessous décrit le codage de la chaîne 「日本語版Wikipedia」 (Wikipedia version japonaise) avec la convention ISO-2022-JP.
La première ligne indique chaque caractère. La ligne intermédiaire indique le numéro associé à chaque caractère ou le changement de codage. La dernière ligne indique chaque octet, sous forme ASCII en bas, et hexadécimal codé décimal en partie supérieure.
Illustration: 「日本語版Wikipedia」codé en ISO-2022-JP :
| Caractères représentés | JIS X 0208 を指示 | JIS X 0208 を指示 | JIS X 0208 を指示 | 日 | 日 | 本 | 本 | 語 | 語 | 版 | 版 | ASCII を指示 | ASCII を指示 | ASCII を指示 | W | i | k | i | p | e | d | i | a |
| Octets ISO-2022-JP | JIS X 0208 を指示 | JIS X 0208 を指示 | JIS X 0208 を指示 | 38 | 92 | 43 | 60 | 24 | 76 | 40 | 39 | ASCII を指示 | ASCII を指示 | ASCII を指示 | 87 | 105 | 107 | 105 | 112 | 101 | 100 | 105 | 97 |
| Octets ISO-2022-JP | 01/11 | 02/04 | 04/02 | 04/06 | 07/12 | 04/11 | 05/12 | 03/08 | 06/12 | 04/08 | 04/07 | 01/11 | 02/08 | 04/02 | 05/07 | 06/09 | 06/11 | 06/09 | 07/00 | 06/05 | 06/04 | 06/09 | 06/01 |
| (US-ASCII) | ESC | $ | B | F | | | K | \ | 8 | l | H | G | ESC | ( | B | W | i | k | i | p | e | d | i | a |

### Autre échappements

Certains langages de programmation sont dotées de séquences d'échappement écrites avec des caractères graphiques, comme le caractère \.
En langage C et C++ les séquences ASCII d'échappement sont :
* \' apostrophe. Valeur hexadécimale: 0x27 ;
* \" guillemet. Valeur hexadécimale : 0x22 ;
* \? point d'interrogation. Valeur hexadécimale : 0x3f ;
* \\ Barre oblique inversée. Valeur hexadécimale : 0x5c ;
* \0 caractère nul. Valeur hexadécimale : 0x00 ;
* \a Caractère d'appel audible. Valeur hexadécimale : 0x07 ;
* \b retour arrière (backspace). Valeur hexadécimale : 0x08 ;
* \f nouvelle page. Valeur hexadécimale : 0x0c ;
* \n nouvelle ligne. Valeur hexadécimale : 0x0a ;
* \r retour chariot. Valeur hexadécimale : 0x0d ;
* \t tabulation horizontale. Valeur hexadécimale : 0x09 ;
* \v tabulation verticale. Valeur hexadécimale : 0x0b ;
* \nnn Valeur octale arbitraire. Valeur octale : nnn ;
* \xnn Valeur hexadécimale arbitraire. Valeur hexadécimale : nn ;
* \unnnn Valeur Unicode arbitraire. Peut résulter en plusieurs caractères. Identifiant Unicode : U+nnnn ;
* \Unnnnnnnn Valeur Unicode arbitraire. Peut résulter en plusieurs caractères. Identifiant Unicode : U+nnnnnnnn.
Ces séquences sont utiles pour la manipulation de fichier et de texte dans la console système du système d'exploitation notamment le DOS, Linux et Windows.

## Limites de la norme POSIX

POSIX ne définit aucune façon standard de désigner littéralement des caractères par leur code numérique dans des jeux de caractères à plus de 8 bits (par exemple Unicode). Aussi, nombre d’implémentations de POSIX compatibles Unicode ou ISO/CEI 10646 acceptent aussi les séquences \uNNNN (où NNNN désigne sur 4 chiffres hexadécimaux le point de code Unicode d’un caractère du plan multingue de base) ou \UNNNNNNNN (où NNNNNNNN désigne sur 8 chiffres hexadécimaux le point de code Unicode d’un caractère quelconque du jeu).
La norme ne précise pas non plus si les caractères désignés par un code hexadécimal désignent ceux du fichier source, ou si leur code résulte d’un transcodage du jeu de caractères codés d’entrée vers un jeu commun (tel qu’Unicode). Unicode ou le jeu de base ASCII est presque toujours utilisé en tant que codage interne, mais ce n’est pas toujours vrai sur les systèmes à codage basé sur EBCDIC avec les expressions rationnelles POSIX.
De plus, les jeux de caractères sur 8 bits peuvent différer largement notamment dans la zone haute (non ASCII) et l’interprétation des caractères de contrôle (en fonction du système utilisé). Cela constitue un problème d’interopérabilité, qui est résolu le plus souvent en utilisant, dans les utilitaires de traitement de texte, un jeu de caractère interne commun unique basé sur Unicode et un transcodage du jeu de caractères d’entrée vers ce codage interne commun : avec ce système, les expressions rationnelles peuvent devenir indépendantes des jeux de caractères codés utilisés dans différents documents.