Un paquet de données transmit entre deux machines via internet que ce soit du texte, des images ou du son, tout comme un fichier informatique quel qu'il soit, ne sont finalement qu'une suite de 0 et de 1 que l'on peut regrouper par lots de 8 formant ainsi une séquence d'octects...
Utiliser un encodage plutôt qu'un autre revient à interpréter la même séquence d'octets de deux façons différentes au risque de commettre des erreurs...
Pour interpréter correctement un message textuel échangé entre ordinateurs, le choix d'une convention de codage commune et standardisée s'est imposé dès le début des années 1960. C'est la norme ASCII pour American Standard Code for Information Interchange qui a été retenu pour le codage des caractères.
C'est une table de 128 caractères numérotés de 0 à 127 (codés sur 7 bits) qui inclue les lettres majuscules et minuscules, les symboles de ponctuation (& ~ , . ; # " - etc...) et les chiffres :
Ce jeu de symboles est suffisant pour rédiger un programme informatique ou un texte en Anglais. Mais il ne permet pas d'écrire dans d'autres langues qui utiliseraient des accents par exemple...
Vérifier si la trame d'informations binaires donnée au début du notebook Hexadecimal-Autre_BN_pour_coder prend du sens pour vous si on la décode à l'aide de la table ACSCII ?
010011100101001101001001001011000010000001100011001001110110010101110011011101000010000001100011011011110110111101101100001000000100001
Binaire | Hexadecimal | ASCII |
---|---|---|
01001110 |
4E |
|
01010011 |
53 |
|
01001001 |
49 |
|
00101100 |
2C |
|
00100000 |
20 |
|
01100011 |
63 |
|
00100111 |
27 |
|
01100101 |
65 |
|
01110011 |
73 |
|
01110100 |
74 |
|
00100000 |
20 |
|
01100011 |
63 |
|
01101111 |
6F |
|
01101111 |
6F |
|
01101100 |
6C |
|
00100000 |
20 |
|
00100001 |
21 |
Quelle opération arithmétique doit-on réaliser pour passer d'une minuscule à une majuscule ?
...
...
Peut-on transformer l'image précédemment étudiée en un message textuel codé en ASCCI ?
...
...
Deux fonctions prédéfinies permettent d’effectuer la conversion entre un caractère et son identifiant numérique :
la fonction ord()
renvoie l’identifiant numérique correspondant au caractère passé en argument ;
inversement, chr()
renvoie le caractère correspondant à l'entier passé à cette fonction.
chr(0b01000001)
chr(0x41)
ord('A')
bin(65)
hex(ord('A'))
Tester les fonctions suivantes :
def code(lettre):
return lettre,ord(lettre),bin(ord(lettre))
def decode(nombre):
return chr(nombre),nombre,bin(nombre)
Puis, écrire un programme qui affiche pour toutes les lettres de l’alphabet un résultat du type :
('a', 97, '0b1100001')
('b', 98, '0b1100010')
Enfin, modifier la définition des fonctions pour inclure l'affichage du code ASCII en hexadécimal.
Ecrire un script qui affiche dans un tableau l'ensemble des caractères imprimables et leur code ASCII respectif
Ecrire une fonction minuscule()
qui prend en argument une lettre majuscule et renvoie la lettre minuscule correspondante.
De l’art ASCII (prononcé [aski:]) consiste à créer des images uniquement à l'aide des lettres et caractères spéciaux contenus dans l'American Standard Code for Information Interchange ASCII
C'est l'ancêtre des émoticônes... ;-)
A voir également : la webcam de Micode en ASCII art
Les caractères peuvent être saisis directement par leur code ASCII en utilisant la notation \xhh
où hh
est le code hexadécimal du caractère.
S = '\x20' * 6 + '\x5c' + '\x7c' * 3 + '\x2f' + "\n"
S += '\x20' * 6 + '(0 0)' + "\n"
S += '\x2e\x7e\x6f\x6f\x4f\x7e\x7e(\x5f)' + '\x7e' * 6 + '\x2e' + "\n"
for i in range (0,3):
if i == 1 :
S += '\x7c L\'art ASCII \x7c' + "\n"
else :
S += '\x7c' + '\x20' * 15 + '\x7c' + "\n"
S += "\x27" + '\x7e' * 11 + "\x6f\x6f\x4f\x7e\x27" + "\n"
S += '\x20' * 5 + '\x7c' + '\x5f' * 2 + '\x7c' + '\x5f' * 2 + '\x7c' + "\n"
S += '\x20' * 6 + '\x7c' * 2 + '\x20' + '\x7c' * 2 + "\n"
S += '\x20' * 5 + '\x6f' * 2 + '\x4f\x20\x4f' + '\x6f'*2 + "\n"
print(S)
Développer votre avatar en Art ASCII pour signer les entêtes de vos programmes et les docstrings de vos fonctions...
La nécessité de représenter des textes comportant des caractères non présents dans la table ASCII tels ceux de l'alphabet latin utilisés en français comme le 'à', le 'é' ou le 'ç' impose l'utilisation d'un autre codage que l'ASCII.
Plusieurs propositions de codage coexistent.
Afin de faciliter les choses, ces propositions sont des extensions du codage ASCII :
Mais les 8 bits de l'octet vont être utilisés. Cela permet de coder $2^8 = 256$ caractères, soit 128 caractères supplémentaires.
L'ISO, organisation internationale de normalisation, propose de son côté plusieurs variantes de codages adaptées aux différentes langues. La plus utilisée concerne les langues européennes occidentales. Il s'agit de l'ISO-8859-1, aussi nommé ISO-Latin1.
Microsoft propose le codage dit Windows-1252 (encore appelé ANSI, bien que cela puisse paraître abusif, l'ANSI, American National Standards Institute, n'ayant jamais validé cette table !).
Ce codage ne diffère de l'ISO-8859-1 que pour quelques caractères tels le signe euro, €, la ligature o-e, œ, ou certains guillemets qui utilisent des codes réservés par ISO-Latin-1 pour des caractères de contrôle.
Et les autres langues ? À l'évidence, 256 caractères ne suffisent pas pour représenter les lettres de tous les alphabets utilisés (pensons au russe, à l'hébreu, au chinois, ou encore au japonais, etc...), c'est pour celà qu'un nouveau standard a été introduit au début des années 1990 : Unicode.
La table Unicode comporte la définition de près de cent cinquante mille caractères et a pour ambition de référencer tous les caractères existant au monde. Aussi, pour ne pas augmenter trop considérablement la taille des fichiers, on n'utilise pas directement la table Unicode pour coder les caractères dans la machine...
Unicode accepte plusieurs systèmes de codage : UTF-8, UTF-16, UTF-32. Le codage le plus couramment utilisé, notamment sur le Web, se nomme UTF-8. Son principe est le suivant : une première série de caractères sont codés sur un octet. D'autres caractères sont codés sur deux octets...
Les 128 premiers caractères de la table UTF-8 sont compatibles avec le codage ASCII. Ainsi le codage UTF-8 d'un texte ne comportant que des caractères présents dans la table ASCII sera le même que le codage ASCII de ce texte.
Ce ne sera pas vrai pour un texte ISO-Latin-1.
Il importe donc, quand on veut décoder un texte, de savoir quel est le codage utilisé sous peine de décoder improprement les caractères.
C'est pourquoi en NSI, on utilisera un encodage en UTF-8...
help(chr)
help(ord)
01000010011100100110000101110110011011110010000000100001
Extrait du livre Hatier Prépabac 1ère NSI de Céline ADOBET, Guillaume CONNAN, Gérard ROZSAVOLGYL, Laurent SIGNAC.
En UTF-8, le codage des caractères coïncide avec l'ASCII pour les 128 premiers caractères et les autres caractères sont représentés par plusieurs octets.
La série d'octets suivants, donnés en hexadécimal, a été relevée dans un fichier codé en UTF-8.
43 6F 64 C3 A9 20 65 6E 20 55 54 46 2D 38
Il contient uniquement des caractères de la table ASCII à l'exeption d'un " é ".
Quelle est la séquence d'octets qui représente le " é ", et qu'est-ce qui est écrit dans le fichier ?
Si le fichier avait été interprété en latin 1 (table ci-dessous), qu'est-ce qui se serait affiché ?
ISO/CEI 8859-1 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F | |
0 | positions inutilisées | |||||||||||||||
1 | ||||||||||||||||
2 | SP | ! | " | # | $ | % | & | ' | ( | ) | * | + | , | - | . | / |
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 | { | | | } | ~ | |
8 | positions inutilisées | |||||||||||||||
9 | ||||||||||||||||
A | NBSP | ¡ | ¢ | £ | ¤ | ¥ | ¦ | § | ¨ | © | ª | « | ¬ | - | ® | ¯ |
B | ° | ± | ² | ³ | ´ | µ | ¶ | · | ¸ | ¹ | º | » | ¼ | ½ | ¾ | ¿ |
C | À | Á | Â | Ã | Ä | Å | Æ | Ç | È | É | Ê | Ë | Ì | Í | Î | Ï |
D | Ð | Ñ | Ò | Ó | Ô | Õ | Ö | × | Ø | Ù | Ú | Û | Ü | Ý | Þ | ß |
E | à | á | â | ã | ä | å | æ | ç | è | é | ê | ë | ì | í | î | ï |
F | ð | ñ | ò | ó | ô | õ | ö | ÷ | ø | ù | ú | û | ü | ý | þ | ÿ |
Demander une correction à Martine et/ou vérifier votre réponse à l'aide de la fonction Python suivante :
def code_decode(lettre):
a = lettre.encode('utf8')
b = a.decode('latin_1')
return b
code_decode('é')
Compétences développées | Capacités attendues | Commentaires |
---|---|---|
Représentation d’un texte en machine. Exemples des encodages ASCII, ISO-8859-1, Unicode |
Identifier l’intérêt des différents systèmes d’encodage. Convertir un fichier texte dans différents formats d’encodage. |
Aucune connaissance précise des normes d’encodage n’est exigible. |
Ce document, inspiré des travaux de David ROCHE, Stephan VAN ZUIJLEN, et d'autres ressources listées plus haut, est mis à disposition selon les termes de la Licence Creative Commons Attribution - Partage dans les Mêmes Conditions 4.0 International.
Pour toute question, suggestion ou commentaire : eric.madec@ecmorlaix.fr