Skip to content

Table ASCII et convertisseur de caractères

La table ASCII complète : 128 caractères en décimal, hexadécimal, octal et binaire, plus un convertisseur texte ↔ ASCII. Les caractères de contrôle ont leur échappement, leur notation caret et où vous les croisez.

Sans pistage Fonctionne dans le navigateur Gratuit

Tout s'exécute dans votre navigateur — vos données ne sont jamais envoyées, journalisées ni stockées.

Texte et code ASCII, dans les deux sens

La table ASCII complète (0–127)

128 / 128
Déc Hex Oct Binaire Car. Nom Échappement Caret HTML Où vous le croisez
0 00 000 00000000 NUL Null \0 ^@ � Terminateur de chaîne en C ; sépare les noms de fichiers dans find -print0 et xargs -0 ; grep y voit un fichier binaire.
1 01 001 00000001 SOH Start of Heading ^A  Le protocole FIX s'en sert comme séparateur de champs, d'où ces messages FIX qui ressemblent à une seule ligne compacte.
2 02 002 00000010 STX Start of Text ^B  En-tête de trame des protocoles série, de caisse et de douchette de code-barres ; touche préfixe Ctrl+B de tmux.
3 03 003 00000011 ETX End of Text ^C  Ctrl+C envoie cet octet ; la discipline de ligne du tty le transforme en SIGINT, votre programme ne le voit donc jamais.
4 04 004 00000100 EOT End of Transmission ^D  Ctrl+D valide la ligne de saisie en cours ; quand la ligne est vide, la lecture renvoie 0 octet, et c'est cela l'EOF.
5 05 005 00000101 ENQ Enquiry ^E  Poignées de main des vieilles liaisons ; certains terminaux y répondent par une chaîne d'identification.
6 06 006 00000110 ACK Acknowledge ^F  Associé à ENQ et NAK dans les vieux protocoles de liaison ; encore visible sur du matériel série industriel.
7 07 007 00000111 BEL Bell \a ^G  printf '\a' fait sonner la cloche ; plus souvent aujourd'hui, il termine une séquence OSC comme le titre de fenêtre.
8 08 010 00001000 BS Backspace \b ^H  Effacement dans les barres de progression. La plupart des terminaux envoient 0x7F pour Retour arrière, pas cet octet.
9 09 011 00001001 HT Character Tabulation \t ^I 	 Une recette de Makefile doit commencer par une vraie tabulation ; la touche Tab et Ctrl+I sont le même octet.
10 0A 012 00001010 LF Line Feed \n ^J 
 Saut de ligne sous Unix et macOS ; le core.autocrlf de git convertit entre lui et CRLF.
11 0B 013 00001011 VT Line Tabulation \v ^K  Quasiment éteint, mais compte encore comme saut de ligne : splitlines() le coupe, split("\n") non.
12 0C 014 00001100 FF Form Feed \f ^L  Saut de page sur imprimante ; Ctrl+L efface le terminal ; Emacs s'en sert comme séparateur de sections.
13 0D 015 00001101 CR Carriage Return \r ^M 
 La première moitié du CRLF de Windows ; s'affiche ^M dans git diff ; cause « bad interpreter: /bin/bash^M ».
14 0E 016 00001110 SO Shift Out ^N  Bascule vers le jeu de caractères alternatif G1 en ISO 2022 ; encadre les zones deux octets sur les mainframes EBCDIC.
15 0F 017 00001111 SI Shift In ^O  Revient au jeu de caractères G0 par défaut, en paire avec SO.
16 10 020 00010000 DLE Data Link Escape ^P  Préfixe d'échappement du byte stuffing dans les vieux protocoles binaires.
17 11 021 00010001 DC1 Device Control One ^Q  XON — reprise du contrôle de flux logiciel ; Ctrl+Q dégèle la sortie du terminal.
18 12 022 00010010 DC2 Device Control Two ^R  Aucune signification moderne fixe. Le Ctrl+R du shell est un raccourci readline, sans rapport avec ce code.
19 13 023 00010011 DC3 Device Control Three ^S  XOFF — pause du contrôle de flux logiciel. Un Ctrl+S malencontreux est la cause habituelle d'un terminal figé.
20 14 024 00010100 DC4 Device Control Four ^T  Aucune signification moderne fixe ; sur BSD et macOS, Ctrl+T est la touche d'état du tty.
21 15 025 00010101 NAK Negative Acknowledge ^U  Ctrl+U efface toute la ligne — c'est le réglage kill du tty, pas le sens d'origine de ce code.
22 16 026 00010110 SYN Synchronous Idle ^V  Ctrl+V est lnext : appuyez dessus puis sur Tab pour saisir une vraie tabulation dans bash sans déclencher la complétion.
23 17 027 00010111 ETB End of Transmission Block ^W  Ctrl+W efface le mot précédent — le réglage werase du tty.
24 18 030 00011000 CAN Cancel ^X  ECMA-48 l'utilise pour annuler une séquence de contrôle inachevée ; les terminaux jettent la séquence en cours.
25 19 031 00011001 EM End of Medium ^Y  Rarement utilisé aujourd'hui ; sur BSD et macOS, Ctrl+Y est la suspension différée.
26 1A 032 00011010 SUB Substitute ^Z  Marqueur de fin de fichier des textes CP/M et DOS, d'où le Ctrl+Z qui termine la saisie dans les consoles Windows.
27 1B 033 00011011 ESC Escape ^[  Début de toute séquence ANSI : \033[0m réinitialise la couleur, \033[2J efface l'écran. Ctrl+[ l'envoie aussi.
28 1C 034 00011100 FS File Separator ^\  L'encapsulation MLLP de HL7 v2 s'en sert comme terminateur de bloc ; Ctrl+\ envoie SIGQUIT.
29 1D 035 00011101 GS Group Separator ^]  Dans les codes-barres GS1, le séparateur FNC1 est cet octet — le délimiteur invisible qu'émet votre douchette.
30 1E 036 00011110 RS Record Separator ^^  Les JSON Text Sequences de la RFC 7464 préfixent chaque enregistrement. Un des rares usages modernes encore vivants.
31 1F 037 00011111 US Unit Separator ^_  Séparateur de champs dans le texte structuré, plus sûr qu'une virgule car il n'apparaît jamais dans les données.
32 20 040 00100000 Space  
33 21 041 00100001 Exclamation Mark !
34 22 042 00100010 Quotation Mark "
35 23 043 00100011 Number Sign #
36 24 044 00100100 Dollar Sign $
37 25 045 00100101 Percent Sign %
38 26 046 00100110 Ampersand &
39 27 047 00100111 Apostrophe '
40 28 050 00101000 Left Parenthesis (
41 29 051 00101001 Right Parenthesis )
42 2A 052 00101010 Asterisk *
43 2B 053 00101011 Plus Sign +
44 2C 054 00101100 Comma ,
45 2D 055 00101101 Hyphen-Minus -
46 2E 056 00101110 Full Stop .
47 2F 057 00101111 Solidus /
48 30 060 00110000 Digit Zero 0
49 31 061 00110001 Digit One 1
50 32 062 00110010 Digit Two 2
51 33 063 00110011 Digit Three 3
52 34 064 00110100 Digit Four 4
53 35 065 00110101 Digit Five 5
54 36 066 00110110 Digit Six 6
55 37 067 00110111 Digit Seven 7
56 38 070 00111000 Digit Eight 8
57 39 071 00111001 Digit Nine 9
58 3A 072 00111010 Colon :
59 3B 073 00111011 Semicolon &#59;
60 3C 074 00111100 Less-Than Sign <
61 3D 075 00111101 Equals Sign =
62 3E 076 00111110 Greater-Than Sign >
63 3F 077 00111111 Question Mark ?
64 40 100 01000000 Commercial At @
65 41 101 01000001 Latin Capital Letter A A
66 42 102 01000010 Latin Capital Letter B B
67 43 103 01000011 Latin Capital Letter C C
68 44 104 01000100 Latin Capital Letter D D
69 45 105 01000101 Latin Capital Letter E E
70 46 106 01000110 Latin Capital Letter F F
71 47 107 01000111 Latin Capital Letter G G
72 48 110 01001000 Latin Capital Letter H H
73 49 111 01001001 Latin Capital Letter I I
74 4A 112 01001010 Latin Capital Letter J J
75 4B 113 01001011 Latin Capital Letter K K
76 4C 114 01001100 Latin Capital Letter L L
77 4D 115 01001101 Latin Capital Letter M M
78 4E 116 01001110 Latin Capital Letter N N
79 4F 117 01001111 Latin Capital Letter O O
80 50 120 01010000 Latin Capital Letter P P
81 51 121 01010001 Latin Capital Letter Q Q
82 52 122 01010010 Latin Capital Letter R R
83 53 123 01010011 Latin Capital Letter S S
84 54 124 01010100 Latin Capital Letter T T
85 55 125 01010101 Latin Capital Letter U U
86 56 126 01010110 Latin Capital Letter V V
87 57 127 01010111 Latin Capital Letter W W
88 58 130 01011000 Latin Capital Letter X X
89 59 131 01011001 Latin Capital Letter Y Y
90 5A 132 01011010 Latin Capital Letter Z Z
91 5B 133 01011011 Left Square Bracket [
92 5C 134 01011100 Reverse Solidus \
93 5D 135 01011101 Right Square Bracket ]
94 5E 136 01011110 Circumflex Accent ^
95 5F 137 01011111 Low Line _
96 60 140 01100000 Grave Accent `
97 61 141 01100001 Latin Small Letter A a
98 62 142 01100010 Latin Small Letter B b
99 63 143 01100011 Latin Small Letter C c
100 64 144 01100100 Latin Small Letter D d
101 65 145 01100101 Latin Small Letter E e
102 66 146 01100110 Latin Small Letter F f
103 67 147 01100111 Latin Small Letter G g
104 68 150 01101000 Latin Small Letter H h
105 69 151 01101001 Latin Small Letter I i
106 6A 152 01101010 Latin Small Letter J j
107 6B 153 01101011 Latin Small Letter K k
108 6C 154 01101100 Latin Small Letter L l
109 6D 155 01101101 Latin Small Letter M m
110 6E 156 01101110 Latin Small Letter N n
111 6F 157 01101111 Latin Small Letter O o
112 70 160 01110000 Latin Small Letter P p
113 71 161 01110001 Latin Small Letter Q q
114 72 162 01110010 Latin Small Letter R r
115 73 163 01110011 Latin Small Letter S s
116 74 164 01110100 Latin Small Letter T t
117 75 165 01110101 Latin Small Letter U u
118 76 166 01110110 Latin Small Letter V v
119 77 167 01110111 Latin Small Letter W w
120 78 170 01111000 Latin Small Letter X x
121 79 171 01111001 Latin Small Letter Y y
122 7A 172 01111010 Latin Small Letter Z z
123 7B 173 01111011 Left Curly Bracket {
124 7C 174 01111100 Vertical Line |
125 7D 175 01111101 Right Curly Bracket }
126 7E 176 01111110 Tilde ~
127 7F 177 01111111 DEL Delete ^?  Ce que votre touche Retour arrière envoie vraiment sur la plupart des terminaux. Du ruban perforé : sept trous.

La colonne binaire est complétée à 8 bits pour la lisibilité. L'ASCII lui-même est un code sur 7 bits — le bit de poids fort vaut toujours 0, et c'est exactement ce qui permet à UTF-8 de rester rétrocompatible avec lui.

Et de 128 à 255, alors ?

L'ASCII ne définit pas du tout 128–255. « ASCII étendu » n'est le nom d'aucune norme — c'est un terme vague pour toute une famille d'encodages 8 bits. Le même octet y est un caractère différent à chaque fois :

Octet ISO-8859-1 Windows-1252 CP437 CP866
0x80 U+0080 Contrôle C1 (invisible) Ç А
0x93 U+0093 Contrôle C1 (invisible) ô У
0xB0 ° °
0xE9 é é Θ щ
0xFF ÿ ÿ U+00A0 U+00A0
Les classifications de caractères sont recoupées avec les catégories d'Unicode au moment des tests, et la correspondance Windows-1252 est vérifiée octet par octet face au décodeur de la plateforme. — Équipe d'ingénierie Go-Tools · 2 sept. 2026

Chaque valeur de la table est produite par un moteur unique que font tourner le serveur comme le navigateur : ce que lit un robot d'indexation et ce avec quoi vous interagissez ne peuvent donc jamais diverger. Les différences d'échappement entre langages ont été vérifiées en compilant et en exécutant le code dans chacun, pas citées de mémoire.

Aide-mémoire

Quel est le code ASCII de A ?

A = 65 Le `A` majuscule vaut 65 en décimal, `0x41` en hexadécimal, `101` en octal et `01000001` en binaire. Le `a` minuscule vaut 97 — exactement 32 de plus, c'est-à-dire un seul bit.

Combien de caractères l'ASCII a-t-il ?

128 128, numérotés de 0 à 127. C'est-à-dire 32 caractères de contrôle, 95 caractères graphiques en comptant l'espace, et DEL.

Qu'est-ce que l'ASCII 0 ?

0 = NUL NUL, le caractère nul. Il termine les chaînes en C, sépare les noms de fichiers dans `find -print0`, et fait considérer un fichier comme binaire par `grep`.

Quel octet correspond au saut de ligne ?

LF = 10, CR = 13 Le saut de ligne (LF) vaut 10 (`0x0A`, `\n`). Le retour chariot (CR) vaut 13 (`0x0D`, `\r`). Les fins de ligne Windows sont les deux à la fois, CR en premier.

Qu'est-ce que l'ASCII ?

L'ASCII est un encodage de caractères sur 7 bits — 128 points de code, numérotés de 0 à 127, et pas un de plus. Il a d'abord été publié sous le nom ASA X3.4-1963 et sa forme actuelle est ANSI X3.4-1986 ; RFC 20 décrit son usage sur Internet et a été élevé au rang de norme Internet STD 80 en 2015. La toute première version n'avait aucune lettre minuscule ; celles-ci sont arrivées avec la révision de 1967. Tout ce qui se trouve au-dessus de 127 appartient à un autre encodage, pas à l'ASCII.

0x00-0x1F   32 C0 control characters
0x20         1 space (a graphic character, not a control)
0x21-0x7E   94 printable graphic characters
0x7F         1 DEL (a control character, but not part of C0)
            ---
            128 total

Ce que cette table vous apporte

Les quatre bases côte à côte

Décimal, hexadécimal, octal et binaire sur 8 bits pour chacun des 128 points de code, avec le zéro de tête qui rappelle que l'ASCII est en réalité sur 7 bits.

Les séquences d'échappement par langage

La colonne \0 \a \b \t \n \v \f \r, plus les différences qui cassent vraiment des builds — JavaScript n'a pas de \a, Java n'a ni \a ni \v, et \e est une extension GNU plutôt que de l'ISO C.

La notation caret

La colonne ^@ à ^?, et la règle unique qui couvre les 33 caractères de contrôle : faire un XOR de l'octet avec 0x40. Pas une addition, pas une soustraction — un XOR.

Où vous croisez vraiment chaque caractère de contrôle

Pas seulement « SOH — start of heading », mais le fait que les messages du protocole FIX s'en servent comme séparateur de champs, que 0x1D est le séparateur invisible qu'émet votre douchette de code-barres, et que Ctrl+S qui fige votre terminal, c'est XOFF.

Un convertisseur qui refuse de deviner

C'est vous qui choisissez la base. Les octets au-delà de 127 sont refusés, avec une note sur la façon dont ils se liraient en Windows-1252 et en ISO-8859-1, au lieu d'être présentés comme de l'ASCII.

Les caractères de contrôle restent visibles

NUL, TAB et CR n'ont pas de glyphe : l'aperçu les montre donc avec les Control Pictures d'Unicode. Le bouton de copie vous rend toujours les vrais octets.

Encodages apparentés

ISO/IEC 8859-1 (Latin-1)

8 bits, un octet

Garde 0–127 identique à l'ASCII et définit 96 caractères graphiques de 0xA0 à 0xFF. La plage 0x800x9F est laissée aux caractères de contrôle C1, qui sont invisibles.

Windows-1252

8 bits, un octet

Un sur-ensemble d'ISO-8859-1 dont la seule différence est 0x800x9F, où il place 27 caractères imprimables et en laisse 5 indéfinis. Les navigateurs l'utilisent dès qu'une page se déclare en ISO-8859-1.

CP437

8 bits, un octet

La page de code d'origine de l'IBM PC. Sa moitié haute est faite de lettres accentuées, de lettres grecques et de caractères semi-graphiques — ce sont ces tables-là que l'on voit dans les articles promettant 256 caractères ASCII.

UTF-8

Variable, 1 à 4 octets

Encode tout Unicode tout en gardant chaque octet ASCII identique octet pour octet. Rétrocompatible avec l'US-ASCII, mais avec aucune des pages de code 8 bits ci-dessus.

Exemples

Texte vers codes décimaux

Hello
72 101 108 108 111

Chaque caractère devient son point de code décimal. Les majuscules vont de 65 à 90, les minuscules de 97 à 122 — exactement 32 d'écart, ce qui explique qu'inverser le bit 5 change la casse.

Les mêmes codes lus dans deux bases

41 42 43
hex -> ABC     decimal -> )*+

C'est pour cela que le convertisseur ne devine jamais la base à votre place. Les deux lectures sont valides ; vous seul savez laquelle vous vouliez.

Les caractères de contrôle survivent à l'aller-retour

9 10 13 0
TAB, LF, CR, NUL

Ils sont invisibles dans la zone de sortie : la ligne d'aperçu les montre donc avec les Control Pictures d'Unicode. Le bouton de copie copie toujours les vrais octets, pas les substituts.

Les octets au-delà de 127 sont refusés, avec une explication

233
Outside ASCII (0-127)

233 n'est pas un code ASCII. L'outil vous indique qu'il se lit é aussi bien en Windows-1252 qu'en ISO-8859-1, mais il ne fera pas passer cela pour de l'ASCII.

Comment l'utiliser

  1. 1

    Choisissez la base

    Décimale, hexadécimale, octale ou binaire. Faites-le en premier — les mêmes chiffres se décodent différemment dans chaque base et l'outil refuse délibérément de deviner.

  2. 2

    Tapez d'un côté ou de l'autre

    Le texte à gauche, les codes à droite. Quel que soit le côté où vous tapez, l'autre se met à jour.

  3. 3

    Lisez les avertissements

    Les caractères hors de 0–127 sont listés avec leur point de code et leurs octets UTF-8, plutôt que supprimés en silence ou remplacés par des points d'interrogation.

  4. 4

    Servez-vous de la table comme référence

    Filtrez sur les caractères de contrôle, cherchez par code ou par nom, et cliquez sur un caractère pour le copier.

Des erreurs qu'il vaut mieux connaître

Affirmer que l'ASCII compte 256 caractères

L'ASCII s'arrête à 127. Tout ce qui est au-delà appartient à une page de code 8 bits précise, qu'il faut nommer. Python vous le dira sans détour si vous lui demandez d'encoder une lettre accentuée en ASCII.

✗ Incorrect
'cafe\u00e9'.encode('ascii')  # UnicodeEncodeError: ordinal not in range(128)
✓ Correct
'cafe\u00e9'.encode('utf-8')   # b'cafe\xc3\xa9'

Supposer que tous les langages ont les mêmes échappements

JavaScript n'a pas d'échappement \a. Plutôt que d'échouer, il retire l'antislash et vous laisse la lettre, et le mode strict n'y change rien.

✗ Incorrect
"\a".charCodeAt(0)   // 97 - that is the letter 'a', not BEL
✓ Correct
"\x07".charCodeAt(0) // 7 - BEL

Expliquer la notation caret comme une addition

Ajouter 0x40 fonctionne pour la plage C0 puis casse sur DEL, où il faudrait au contraire soustraire. Le XOR est la règle unique qui couvre les 33.

✗ Incorrect
caret = chr(code + 0x40)   # 0x7F + 0x40 overflows past the table
✓ Correct
caret = chr(code ^ 0x40)   # 0x00 -> @, 0x1B -> [, 0x7F -> ?

Quand vous en avez besoin

Lire un dump hexadécimal ou une trace de protocole
Vous avez des octets et vous devez savoir lesquels sont imprimables, lesquels sont des séparateurs, et lesquels sont des codes de contrôle sur lesquels le terminal agit sans rien dire.
Déboguer un fichier qui se comporte bizarrement
Un CR égaré à la fin de chaque ligne, un NUL qui fait dire à grep que le fichier est binaire, ou une tabulation là où un Makefile en exigeait une.
Écrire un analyseur ou un validateur
Décider quelles plages d'octets accepter, et placer les bornes correctement — 0x210x7E pour les caractères graphiques, 0x20 pour l'espace, 0x7F pour DEL.
Expliquer un bug d'encodage
Montrer à un collègue pourquoi le même octet apparaît sous trois caractères différents selon la page de code que le lecteur a supposée.

Détails techniques

ASCII, Unicode et UTF-8
Les 128 premiers points de code d'Unicode, U+0000 à U+007F, correspondent un à un à l'ASCII. UTF-8 les encode sur un seul octet 0x000x7F, bit de poids fort à 0. La propriété qui compte vraiment est la troisième : chaque octet d'une séquence UTF-8 multi-octets a son bit de poids fort à 1, donc un octet situé dans la plage 0–127 ne peut jamais faire partie d'un caractère non ASCII. C'est cela qui permet de parcourir de l'UTF-8 octet par octet à la recherche de /, \0 ou \n sans risque.
Le 8e bit
L'ASCII définit un code sur 7 bits ; stocker un caractère par octet de 8 bits est une convention, et historiquement ce bit libre servait souvent de bit de parité. Les transports de courrier qui ne garantissaient que la transparence sur 7 bits sont la raison d'être de Base64 et du quoted-printable.
Pourquoi l'alphabet est rangé ainsi
Les chiffres 09 occupent 0x300x39, si bien que le quartet de poids faible est la valeur elle-même. A vaut 0x41 et a vaut 0x61 — un seul bit d'écart, donc c | 0x20 met en minuscules et c & 0xDF en majuscules. Mais uniquement pour les lettres : '_' | 0x20 donne 0x7F, c'est-à-dire DEL, et '[' | 0x20 donne {.
Les variantes nationales et le problème du 0x5C
L'ISO/IEC 646 autorisait la substitution de 12 points de code selon le pays. Le JIS X 0201 japonais a placé un signe yen en 0x5C, le KS X 1003 coréen un signe won — d'où les chemins affichés avec un signe yen sur un Windows japonais alors que l'octet reste 0x5C. C'est pire en Shift_JIS, où le second octet d'un caractère sur deux octets peut lui-même valoir 0x5C : les caractères hyou, so, juu, nou, kou et bou se terminent tous par lui, si bien qu'un traitement naïf des antislashs les coupe en deux.

Bien faire les choses

Nommez la page de code, toujours
« ASCII étendu » n'apprend rien au lecteur. Dites Windows-1252, ou ISO-8859-1, ou CP437 — le même octet est un caractère différent dans chacun.
Dites US-ASCII quand c'est ce que vous voulez dire
C'est le nom enregistré auprès de l'IANA. charset=ascii n'en est pas un, et dans un navigateur charset=ISO-8859-1 vous donnera en réalité du Windows-1252, parce que le WHATWG Encoding Standard fait correspondre l'étiquette ainsi.
Ne devinez jamais une base à la place de l'utilisateur
Si votre outil ou votre analyseur décide en silence que 41 est de l'hexadécimal, il se trompera à peu près une fois sur deux et l'échec sera silencieux.
Itérez par point de code, pas par unité UTF-16
"A" + clé de sol + caractère chinois a une .length === 4 alors qu'il n'y a que trois caractères. Utilisez [...str] ou codePointAt, sinon votre message « caractère non pris en charge » signalera les emoji comme deux moitiés cassées.

Questions fréquentes

Combien de caractères compte l'ASCII ?
128. L'ASCII est un code sur 7 bits : il définit exactement les points de code 0 à 127 — 32 caractères de contrôle C0, 95 caractères graphiques en comptant l'espace, et DEL. Les articles intitulés « table ASCII complète (256 caractères) » vous montrent une page de code 8 bits bien précise — le plus souvent CP437 ou Windows-1252 — pas de l'ASCII.
Qu'est-ce que l'ASCII étendu ?
Rien, à strictement parler. « ASCII étendu » n'est le nom d'aucune norme ; c'est un terme vague pour toute une famille d'encodages 8 bits qui gardent 0–127 à l'identique et définissent 128–255 chacun à sa manière. L'octet 0xE9 vaut é en ISO-8859-1, la lettre grecque Θ en CP437 et une lettre cyrillique en CP866. Sans nommer la page de code, la question n'a pas de réponse.
Windows-1252, est-ce la même chose qu'ISO-8859-1 ?
Les deux sont identiques de 0xA0 à 0xFF, et complètement différents de 0x80 à 0x9F. ISO-8859-1 laisse cette plage aux caractères de contrôle C1, qui sont invisibles ; Windows-1252 y place 27 caractères imprimables — le signe euro, les guillemets courbes, les tirets demi-cadratin et cadratin — et laisse 5 positions indéfinies. C'est pourquoi une apostrophe courbe copiée depuis un traitement de texte devient un caractère de contrôle invisible dès qu'elle passe par quelque chose qui est réellement de l'ISO-8859-1.
DEL est-il un caractère de contrôle ?
Oui. Unicode classe U+007F en Cc, et iscntrl(127) du C vaut vrai. Il ne fait simplement pas partie du jeu C0, qui est strictement 0x000x1F. S'il se trouve à la fin de la table, c'est à cause du ruban perforé : 0x7F, ce sont sept trous perforés, et comme on ne peut pas reboucher un trou, « tous les trous perforés » était le seul moyen de marquer un caractère comme supprimé.
L'espace est-il un caractère de contrôle ?
Non, et bien des tables ASCII se trompent là-dessus. Unicode classe l'espace (0x20) en Zs, séparateur d'espace, c'est-à-dire un caractère graphique. Seuls 0x000x1F et 0x7F sont des caractères de contrôle.
Pourquoi ma colonne binaire affiche-t-elle 8 bits si l'ASCII est sur 7 bits ?
Parce que l'octet est l'unité dans laquelle tout est réellement stocké — le bit de poids fort vaut simplement toujours 0. Ce remplissage n'est pas cosmétique : c'est précisément parce que l'ASCII n'utilise jamais le huitième bit qu'UTF-8 a pu se l'approprier comme drapeau « ceci fait partie d'une séquence multi-octets », et c'est cela qui rend UTF-8 rétrocompatible avec l'ASCII.
Tous les langages écrivent-ils les caractères de contrôle de la même façon ?
Non, et les différences mordent. \a (sonnerie) est standard en C et en Python, mais JavaScript n'a pas cet échappement — '\a' devient silencieusement la lettre a, sans erreur même en mode strict. Java refuse aussi bien \a que \v. Go refuse \0 parce que ses échappements octaux doivent faire exactement trois chiffres : on écrit donc \000. Et \e pour ESC est une extension GNU, pas de l'ISO C.
Que veut dire ^M dans un diff ou dans vim ?
C'est un retour chariot, l'octet 13. La notation caret écrit un caractère de contrôle en faisant un XOR de sa valeur avec 0x40 : CR (0x0D) devient donc ^M et ESC (0x1B) devient ^[. Voir ^M à la fin de chaque ligne signifie que le fichier a des fins de ligne CRLF Windows ; voir bad interpreter: /bin/bash^M signifie qu'un script shell les a récupérées.