Généralités et premiers caractères

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 :

  • \n pour le retour à la ligne (penser nouvelle ligne) ;

  • \r pour le retour chariot (penser à une machine à écrire) ;

  • \t pour 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 de var en 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.