4.1. Généralités et premiers caractères#
Un ordinateur ne manipule que des nombres binaires, comme '0b1001', la question qui s’est assez rapidement posée est celle de la représentation des caractères.
2**(8 - 1)
128
On rappelle qu’on groupe de 8 bits forme un octet, qui est l’unité de base de la numération dans un ordinateur.
Note
Un bit est un nombre binaire qui est soit 1 soit 0. C’est la plus petite unité non-divisible, mais ça n’est pas l’unité pratique (qui est l’octet.)
Le calcul \(2^{8-1} = 128\) correspond au nombre de nombres représentables avec 7 bits. Le dernier bit devait correspondre à un bit de contrôle. Celui-ci devait être nécessaire pour les Teletype des années 1960.
Bob Bemer, qui travaillait pour IBM, a établi une correspondance entre les nombres entre 0 et 127 et les caractères de l’alphabet en 1963. Cette table de correspondance, élaborée aux États-Unis, s’appelle la table ASCII.
La fonction chr() permet d’obtenir le caractère associé à un nombre.
chr(65)
'A'
chr(95)
'_'
chr(0)
'\x00'
Essayons déjà les 16 premiers caractères.
def premiers_caractères_ascii():
r = ""
for i in range(16):
r = r + f"{chr(i):2}"
return r
premiers_caractères_ascii()
'\x00 \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \t \n \x0b \x0c \r \x0e \x0f '
Ces 16 premiers caractères sont essentiellement des caractères de contrôle. Ils servent à contrôler l’affichage (souvent des impressions dans les années 1960). En particulier, on peut noter :
\npour le retour à la ligne (penser nouvelle ligne) ;\rpour le retour chariot (penser à une machine à écrire) ;\tpour la tabulation (4 espaces, bien connue en Python).
Note
Ces caractères de fin de lignes peuvent varier en fonction de l’utilisateur (et sont parfois liés au système d’exploitation.)
La tabulation ‘\t’ peut aussi être interprété différement par votre éditeur (ou par votre SE.)
Note
Légende des caractères de contrôle
NUL : Null character
SOH : Start of Heading
STX : Start of Text
EOT : End of Transmission
ENQ : Enquiry
ACK : Acknowledge
BEL : Bell (alerte sonore)
BS : Backspace
HT : Horizontal Tab
LF : Line Feed (saut de ligne)
VT : Vertical Tab
FF : Form Feed
CR : Carriage Return
SO/SI : Shift Out/Shift In
DLE/DC1/DC2/DC3/DC4 : Data Link Escape/Device Controls
NAK : Negative Acknowledge
SYN : Synchronous Idle
ETB : End of Transmission Block
CAN : Cancel
EM : End of Medium
SUB : Substitute
ESC : Escape
FS/GS/RS/US : File/Group/Record/Unit Separators
DEL : Delete
Table ASCII
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
|
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 |
NUL |
SOH |
STX |
ETX |
EOT |
ENQ |
ACK |
BEL |
BS |
HT |
LF |
VT |
FF |
CR |
SO |
SI |
1 |
DLE |
DC1 |
DC2 |
DC3 |
DC4 |
NAK |
SYN |
ETB |
CAN |
EM |
SUB |
ESC |
FS |
GS |
RS |
US |
2 |
! |
« |
# |
$ |
% |
& |
’ |
( |
) |
* |
+ |
- |
. |
|||
3 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
: |
; |
< |
= |
> |
? |
4 |
@ |
A |
B |
C |
D |
E |
F |
G |
H |
I |
J |
K |
L |
M |
N |
O |
5 |
P |
Q |
R |
S |
T |
U |
V |
W |
X |
Y |
Z |
[ |
|] |
^ |
_ |
|
6 |
` |
a |
b |
c |
d |
e |
f |
g |
h |
i |
j |
k |
l |
m |
n |
o |
7 |
p |
q |
r |
s |
t |
u |
v |
w |
x |
y |
z |
{ |
} |
~ |
Note
Si on cherche à afficher cette table avec Python, on obtient certains caractères non représentables pour lesquels on affiche leur valeur en hexadécimal. Voir le cours sur le sujet.
def table_ascii():
l = []
for i in range(8):
r = ""
for j in range(16):
if i in [0, 1]:
r = r + f"{chr(i*16 + j):^3}"
else:
r = r + f"{chr(i*16 + j):^6}"
l = l + [r]
return l
table_ascii()
[' \x00 \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \t \n \x0b \x0c \r \x0e \x0f ',
' \x10 \x11 \x12 \x13 \x14 \x15 \x16 \x17 \x18 \x19 \x1a \x1b \x1c \x1d \x1e \x1f ',
' ! " # $ % & \' ( ) * + , - . / ',
' 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ',
' @ A B C D E F G H I J K L M N O ',
' P Q R S T U V W X Y Z [ \\ ] ^ _ ',
' ` a b c d e f g h i j k l m n o ',
' p q r s t u v w x y z { | } ~ \x7f ']
Note
Les \(f\)-strings, qui s’écrivent f"{a} ... {n}" permettent de formater des chaînes de caractères en remplaçant
le contenu des {a} par la valeur représentée par la variable a. On peut, de plus, apporter des transformations :
{var:08b}transformera la valeur décimale devaren sa représentation binaire sur 8 bits ;{128564:c}affichera le caractère, s’il existe et est représentable dans la fonte courante, correspondant au point de code ;{1/7:.5f}affichera les 5 premières décimales.help('FORMATTING')vous permettra d’en savoir davantage.
On peut remarquer que dans cette table les lettres ne sont pas réellement mises au hasard :
'A'correspond à000001écrit sur 6 bits'Z'correspond à011010écrit sur 6 bits'a'correspond à100001écrit sur 6 bits'z'correspond à111010écrit sur 6 bits
Le passage des majuscules aux miniscules se fait donc en changeant un seul bit.