représentation et codage de l’information
4. représentation des données textuelles
Pierre Réty
février 2021
L1 informatique — Université d’Orléans
Retour sur le codage des caractères
Codage des caractères
Le langage écrit repose sur l’utilisation d’alphabets, de
graphèmes, de symboles.
Les fichiers contiennent des suites d’octets.
La convention qui associe un caractère à un code numérique
est appelée codage de caractères.
Remarque Une fois cette convention choisie, il reste encore
pour l’afficher à associer une représentation graphique à une
suite de caractères, mais c’est une autre histoire (glyphe,
ligature, etc).
1
ASCII
Norme incontournable, codage de caractères sur 7 bits adapté
à l’alphabet anglais + 33 codes de contrôle.
Un 0 est rajouté à gauche pour obtenir un octet complet (8 bits).
Ainsi, le caractère a est codé par l’octet 61 = 0110 0001
2
ISO 8859
Norme définissant 16 façons ISO-8859-𝑛 d’étendre ASCII, avec
le bit gauche à 1, pour la gestion d’autres langues :
• ISO-8859-1, latin-1, européen occidental
• ISO-8859-2, latin-2, européen central
• ISO-8859-3, latin-3, européen du Sud
• ISO-8859-4, latin-4, européen du Nord
• ISO-8859-5, cyrillique
• ISO-8859-6, arabe
• ISO-8859-7, grec
• ISO-8859-8, hébreu
• ISO-8859-9, latin-5, turc
• ISO-8859-10, latin-6, nordique
• ISO-8859-11, thaï
• ISO-8859-13, latin-7, balte
• ISO-8859-14, latin-8, celtique
• ISO-8859-15, latin-9, latin-1 + € 3
• ISO-8859-16, latin-10, européen du Sud-Est
ISO-8859-15 (latin-1 + codage de €)
𝑥= 0 1 2 3 4 5 6 7 8 9 𝐴 𝐵 𝐶 𝐷 𝐸 𝐹
Ainsi, le caractère é est codé par l’octet 𝐸9 = 1110 1001
4
EBCDIC
Codage exotique utilisé par les mainframe IBM.
5
Unicode
Compatible avec Universal Character Set (UCS, ISO/IEC 10646)
Standard visant à normaliser les échanges de texte au niveau
mondial. Modélise les caractères et leurs traitements.
Décrit plus de 110000 caractères couvrant plus de 100 écritures.
Associe un mot binaire à chaque caractère : les 256 premiers
sont identiques à ISO-8859-1 (latin-1).
Initialement codé sur 16 bits, aujourd’hui sur 17 plans de 65536
caractères, soit 1114112 caractères codables de 0x0 à 0x10FFFF.
Rappel : 0x10FFFF est le nombre 10FFFF écrit en base 16.
Notation : U+0000 à U+FFFF pour le premier plan (BMP),
6
U+10000 à U+10FFFF pour les autres plans.
Implémentation de l’unicode : UTF-32
Chaque mot binaire est représenté sur 32 bits, en complétant
par des 0 à gauche.
Un texte, même en anglais, occupe quatre fois plus de place !
Peu utilisé en pratique, éventuellement pour la représentation
interne de chaînes Unicode.
7
Implémentation de l’unicode : UTF-8
UTF-8 est un codage à longueur variable compatible ASCII et
latin-1, très répandu, en particulier pour le Web et le mail.
bits dernier code octet 1 octet 2 octet 3 octet 4
7 U+7F 0xxxxxxx
11 U+7FF 110xxxxx 10xxxxxx
16 U+FFFF 1110xxxx 10xxxxxx 10xxxxxx
21 U+10FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
Si besoin, on complète par des 0 à gauche pour avoir le nombre de bits demandés.
Exemple Unicode UTF-8
@ U+40 1000000 (7 bits) 01000000 0x40
é U+E9 000 11101001 (11 b) 11000011 10101001 0xC3 0xA9
€ U+20AC 00100000 10101100 11100010 10000010 10101100 0xE2 0x82 0xAC
Rem : les codages unicode des caractères @ et é sont les mêmes qu’en latin-1 (et
ASCII pour @). Mais en UTF-8, @ est codé sur 1 octet, é sur 2 octets, € sur 3 octets.
Les caractères anglais, donc codables en ASCII, sont codés sur 1 octet en UTF-8. 8
Normalisation
Histoire de compliquer un peu tout ça, Unicode propose
plusieurs manières de définir un même caractère :
é est codé U+00E9 ou U+0065 U+0301 (e suivi d’un accent aigü).
De plus, dans certains contextes, ont peut avoir envie
d’ interpréter à l’identique certains caractères à la sémantique
différente :
U+00C5 LATIN CAPITAL LETTER A WITH RING ABOVE : Å
U+212B ANGSTROM SIGN : Å
Unicode définit donc des normalisations du texte pour
permettre la comparaison de chaînes.
9
En pratique
En dehors du codage proprement dit, problème du codage des
fins de lignes : CR vs LF vs CRLF.
10
Fichier texte brut
Un fichier texte est une suite de codes de caractères dans un
encodage fixé (ASCII, latin-1, latin-9, UTF-8, …).
Ici, le fichier dumbo.txt est codé en UTF-8. cat et hexdump sont des commandes
exécutées dans un terminal sous Linux ou MacOS. Ne pas tenir compte des numéros
d’octets 000000, 000010, etc...
$ cat dumbo.txt
BlaBlaBlaBla
Un éléphant qui se balançait sur une toile d'araignée.
$ hexdump dumbo.txt
000000 42 6c 61 42 6c 61 42 6c 61 42 6c 61 0a 55 6e 20
000010 c3 a9 6c c3 a9 70 68 61 6e 74 20 71 75 69 20 73
000020 65 20 62 61 6c 61 6e c3 a7 61 69 74 20 73 75 72
000030 20 75 6e 65 20 74 6f 69 6c 65 20 64 27 61 72 61
000040 69 67 6e c3 a9 65 2e 0a 11
Base64 (Norme RFC 2045, 1996)
Afficher un texte UTF-8 avec l’alphabet américain.
On découpe la suite d’octets en mots de 6 bits.
Ainsi 3 octets = 4 mots de 6 bits.
chaque mot de 6 bits ⟹ entier compris entre 0 et 63
chaque entier ⟹ codé par le caractère :
0=A, 1=B,…, 25=Z, 26=a, …, 51=z, 52=0, …, 61=9, 62= +, 63= /
Remplissage (padding)
On complète par des zéros pour avoir un nombre entier de
mots de 6 bits.
si on ajoute 2 zéros, on rajoute = à la fin du texte codé
si on ajoute 4 zéros, on rajoute == à la fin du texte codé
12
0 A 17 R 34 i 51 z
1 B 18 S 35 j 52 0
2 C 19 T 36 k 53 1
3 D 20 U 37 l 54 2
4 E 21 V 38 m 55 3
5 F 22 W 39 n 56 4
6 G 23 X 40 o 57 5
7 H 24 Y 41 p 58 6
8 I 25 Z 42 q 59 7
9 J 26 a 43 r 60 8
10 K 27 b 44 s 61 9
11 L 28 c 45 t 62 +
12 M 29 d 46 u 63 /
13 N 30 e 47 v
14 O 31 f 48 w (pad) =
15 P 32 g 49 x
16 Q 33 h 50 y
13
Base64 (Norme RFC 2045, 1996)
Fichier texte en UTF-8.
$ cat dumbo.txt
BlaBlaBlaBla
Un éléphant qui se balançait sur une toile d'araignée.
$ python -m base64 -e < dumbo.txt
QmxhQmxhQmxhQmxhClVuIMOpbMOpcGhhbnQgcXVp
IHNlIGJhbGFuw6dhaXQgc3VyIHVuZSB0b2lsZSBk
J2FyYWlnbsOpZS4=
14
Données structurées
Structuration des données
Données non structurées :
• le contenu d’un fichier texte
• un enregistrement audio
• une collection de photographies
Données semi-structurées :
• une page web
• vos notes de cours
• un dictionnaire
Données structurées :
• les horaires de cinéma
• le contenu d’un agenda
• le système de réservation d’une compagnie aérienne 15
Modélisation relationnelle
Les données sont organisées en tables (ou relations).
id Interprète Titre Année
1 Led Zeppelin Stairway to Heaven 1971
2 AC/DC Highway to Hell 1979
… … … …
Colonnes champs, attributs
Lignes tuples, n-uplets
16
Le format textuel CSV
Le format de fichier CSV (comma-separated values) représente
un tableau par un texte.
Chaque ligne du fichier correspond à un enregistrement, une
ligne du tableau.
Les colonnes sont séparées par un séparateur (virgule ou
point-virgule).
id,Interprète,Titre,Année
1,Led Zeppelin,Stairway to Heaven,1971
2,AC/DC,Highway to Hell,1979
17
Données semi-structurées
XML
Un document XML (eXtensible Markup Language) est une
chaîne de caractère structurée par des balises.
• balise ouvrante : <bonjour>
• balise fermante : </aurevoir>
• balise vide : <message />
Toute balise ouvrante est fermée par une balise fermante de
même nom.
Une balise vide ou bien l’ensemble du texte entre une balise
ouvrante et la balise fermante correspondante forme un
élément.
18
<? xml version="1.0" encoding="utf-8" standalone="yes" ?>
<filmographie>
<film id="sw" acteur="cf,mh">
<titre>Star Wars</titre>
<annee>1977</annee>
</film>
<acteur id="cf" jouedans="sw">
<nom>Carrie Fisher</nom>
<adresse>
<rue>Maple St.</rue><ville>Hollywood</ville>
</adresse>
<adresse>
<rue>Locust Rd.</rue><ville>Malibu</ville>
</adresse>
</acteur>
<acteur id="mh" jouedans="sw">
<nom>Mark Hamill</nom>
<rue>Oak St.</rue>
<ville>Bollywood</ville>
</acteur>
</filmographie>
HTML : code source d’une page web
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><title>Exemple XHTML 1.0</title></head>
<body><h2>Texte codé en UTF-8, et décodé en latin-1 !</h2>
<ul>
<li>Tous les éléments doivent être explicitement balisés.</li>
<li>Les balises fermantes ne sont pas optionnelles.</li>
<li>Les noms d'éléments et d'attributs
<em class="important">doivent</em> être en minuscules.</li>
<li>Tous les attributs doivent avoir une valeur explicite
<input type="checkbox" checked="checked" value="..." />.</li>
<li>Les guillemets sont <em class="important">toujours</em>
obligatoires autour des valeurs d'attribut.</li>
<li>Les éléments vides doivent être fermés
<img src="i.png" alt="i"/>.</li>
</ul></body></html>
Affichage par le navigateur web
Le fichier HTML est codé en UTF-8.
Page web affichée avec décodage latin-1 :
Rem : Chaque é est codé sur 2 octets en UTF-8, ce qui donne 2 caractères en latin-1.
Page web affichée avec décodage UTF-8 :
21