fichier sem06-td

Transcription

fichier sem06-td
ASR1 - Déroulement TD n˚6
Semestre 1 - 2011-2012
Département Informatique
IUT Bordeaux 1
17 octobre 2011
Résumé
Redirections, Subversion,
Table des matières
1 Codage
1.1 Rappels . . . . . . . . . . . . . . . . .
1.2 Code ASCII . . . . . . . . . . . . . . .
1.3 ISO . . . . . . . . . . . . . . . . . . .
1.4 Autres codes 8 bits basés sur l’ASCII .
1.5 Pratique : la commande od . . . . . .
1.6 Pratique : la commande iconv . . . .
1.7 recode . . . . . . . . . . . . . . . . . .
1.8 Langues à idéogrammes . . . . . . .
1.9 Codes constructeurs . . . . . . . . . .
1.10 Besoin d’un codage universel . . . . .
1.11 Unicode . . . . . . . . . . . . . . . . .
1.11.1 UTF-32 . . . . . . . . . . . . .
1.11.2 UTF-8 . . . . . . . . . . . . . .
1.11.3 UTF-16 . . . . . . . . . . . . .
1.12 BOM : Byte Order Mark . . . . . . . .
1
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
2
2
2
2
3
3
4
4
5
5
5
6
6
6
7
7
1
1.1
Codage
Rappels
– bit (0 ou 1) = plus petite unité d’information représentable sur un ordinateur
– manipulation d’octet (8 bits), valeurs comprises entre 0 et 255
⇒ pour une valeur plus grande, il faut utiliser plusieurs octets.
Pour représenter des caractères dans un fichier texte, on associe une séquence de bits
(code) à une lettre, à un chiffre ou à un symbole. Un codage de caractères spécifie comment
représenter un caractère.
Lorsque les séquences ont toutes la même taille (par exemple 8 bits), on parle de codage
de taille fixe. Les caractères correspondent alors à des nombres codés en binaire.
1.2
Code ASCII
Le premier codage largement répandu fut l’ASCII (American Standard Code for Information
Interchange) standard créé en 1967. Ce code est un code à 7 bits qui définit les codes de 0 à
127 (0 à 27 ) caractères anglais, les nombres de 0 à 9 et certains caractères spéciaux.
Il ne définit pas les codes de 128 à 255 et ne comporte pas les lettres accentuées qui sont
nécessaires pour la plupart des langages européens.
1.3
ISO
Comme l’ASCII est très limité, l’ISO (International Organization for Standardization) a créé
des standards pour les codes de 128 à 255. Le plus utilisé est le standard ISO-8859-1, connu
2
aussi sous le nom Latin 1. Il inclut les lettres accentuées nécessaires pour la plupart des langages européens comme le français, l’allemand, l’espagnol, le norvégien.
1.4
Autres codes 8 bits basés sur l’ASCII
Il existe des codes ISO différents pour les langages qui emploient d’autres caractères.
Tous les codes à un octet sont identiques au code ASCII pour les caractères de 0 à 127, les
caractères accentués ou spéciaux occupent les positions 128 à 255.
– la “page de code 850” est une page de code définie par IBM et qui est utilisée en Europe
occidentale avec le système DOS et autres systèmes de la même époque (wikipédia).Elle
est dérivé de la “page de code 437” appelée aussi DOS US, qui était le jeu de caractères
codé en mémoire morte des premiers PC.
– les codes pour les alphabets cyrilliques, le turc, le vietnamien, l’arabe etc.
– Windows-1252
1.5
Pratique : la commande od
La commande
od -c fichier
permet de bien voir le contenu d’un fichier.
Options utiles :
– -c (ascii ou backslash)
– -a (ignore le bit de poids fort)
3
– -t d1 : en décimal
– -t u1 : en décimal non signé
– -t x1 : en hexadécimal
Pratique
–
–
–
–
–
sous emacs, tapez deux ou trois lignes de texte accentué
regardez ce texte avec les différentes options od
comment sont représentés les sauts de ligne ? (codage numérique)
les caractères accentués ?
téléchargez la page d’accueil du LaBRI
wget http://www.labri.fr -O labri.txt
et regardez le codage des fins de lignes (faire od .... | head -n 20 pour ne
voir que le début).
– idem avec www.u-bordeaux1.fr
Conclusion : il y a aussi des problèmes éventuels de reconnaissance/conversion
des fins de lignes.
1.6
Pratique : la commande iconv
iconv -f oldcode -t newcode entree -o sortie
– oldcode : l’encodage du fichier d’origine
– newcode : l’encodage souhaité
– entrée : le fichier d’origine
– sortie : le fichier souhaité
exemple : iconv -f ISO-8859-1 -t UTF-8 index.iso -o index.html
1.7
recode
La commande GNU Recode prend en charge d’autres conversions, par exemple les sauts
de lignes,
$ od -c texte
0000000
t
e x
t
0000020
e
d
e
0000036
$ recode latin1..dos/crlf
$ od -c texte.dos
0000000
t
e x
t
0000020
d
e
d
0000040
e
u
x
a
c
l
c
i
e
g
n
n
t
e
u 351
s \n
\n
d
c
l
e
i
n
g
t
n
u 202 \r \n
e s \r \n
c
e
n
t
u
<texte >texte.dos
e
e
u
a
x
c
ou le codage avec d’autres conventions
$ recode latin1..html <texte
$ od -c texte.html
0000000
t
e x
t
e
>texte.html
a
c
4
&
e
a
0000020
0000040
0000045
c
g
u
n
t
e
e
s
; \n
\n
d
e
d
e
u
x
e
l
n
i
t
g
u
n
l
i
'
s
e
\n
$ recode latin1..latex <texte >texte.tex
$ od -c texte.html
0000000
t
e x
0000020 \n
d e
0000040
1.8
t
e
d
e
a
u
c
x
c
\
e
Langues à idéogrammes
Quelques langages ont un très grand nombre de caractères comme le chinois, le japonais
ou le coréen. Il a donc fallu utiliser au moins deux octets au lieu d’un pour les représenter. Avec
deux octets, on dispose de 256 × 256 = 65536 codes.
1.9
Codes constructeurs
Chaque constructeur d’ordinateur a aussi développé ses propres codes non conformes aux
standards internationaux (IBM EBCDIC, Windows-1252,..)
Pratique
– observez
echo coucou | recode latin1..ebcdic | od -t u1
codage du saut de ligne ?
– même chose avec les chiffres ?
– que remarquez vous sur l’alphabet ? (y a des trous !)
1.10
Besoin d’un codage universel
Il est indispensable, pour l’échange d’information, de préciser le codage utilisé. Ne pas le
faire peut rendre un document difficilement lisible (remplacement des lettres accentuées par
d’autres suites de caractères, ...).
⇒ ce qui explique les caractères étranges présents dans certains fichiers que vous ouvrez/recevez.
Cette situation était acceptable quand on utilisait un document écrit dans une seule langue.
L’arrivée de l’Internet a tout bouleversé. La nouvelle demande était de représenter simultanément tous les caractères de toutes les langues.
La mise au point et l’adoption de l’Unicode a été très lente car le codage des caractères
posait de gros problèmes techniques et politiques. La représentation sous 2 octets de l’Unicode
dite UTF-16 doublait la taille des documents, d’une manière considérée comme inutile pour la
majorité des systèmes installés.
5
1.11
Unicode
http://fr.wikipedia.org/wiki/Unicode
Dans Unicode, chaque caractère de chaque alphabet (ou chaque symbole), appelé “point
de code” reçoit un nom officiel (par exemple “ Lettre majuscule latine c cédille”) et un index (ici
U+00C7, codé en hexadécimal).
Dans Unicode 4.1, il y près de 245 000 points de codes assignés dans un espace pouvant
contenir 1 114 112 codes différents.
Les points sont regroupés par plages : le latin de base (qui correspond à l’ascii) va de 0 à 7F.
Le supplément latin 1 (lettres accentuées Europe de l’ouest) de 80 à 8F, l’alphabet phonétique
international de 250 à 2AF, les symboles musicaux byzantins de 1D000 à 1D0FF etc.
En théorie, les index Unicode vont de 0 à U+FFFFFF (6 chiffres hexa soit 224 − 1).
1.11.1
UTF-32
Nous avons une numérotation des caractères : comment passer à une représentation binaire ?
La solution la plus simple est UTF-32 : chaque index sera codé sur 32 bits. Donc le C cédille
majuscule s’écrit (en hexa) 00 00 00 C7.
Mais elle n’est pas économique : il faut 4 octets par caractères. Alors que pour nous autres
occidentaux, 8 bits/caractère suffisent pour la plupart des textes.
Comment coder de façon efficace ?
1.11.2
UTF-8
Le codage UTF-8 répond à ces besoins. L’idée est d’un codage à taille variable : les caractères les plus utilisés de 0 à 127 sont codés sur un octet, les caractères de 128 à 1023 sur 2
octets et au-dessus de 1023 sur 3 octets et ce jusqu’à 4 octets.
Pour ce faire, les bits de poids fort du premier octet indiquent le nombre d’octets utilisés :
caractère.
Représentation
Signification
0xxxxxxx
1 octet codant 1 à 7 bits
110xxxxx 10xxxxxx
2 octets codant 8 à 11 bits
1110xxxx 10xxxxxx 10xxxxxx
3 octets codant 12 à 16 bits
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 4 octets codant 17 à 21 bits
Les avantages :
– Un texte écrit en US-ASCII reste inchangé. (Le passage à l’UTF-8 est invisible pour les
américains.) En revanche un texte écrit en ISO-8859-1 est modifié pour les lettres accentuées représentées en UTF-8 sur 2 caractères.
⇒ La taille d’un texte avec des accents est donc seulement augmentée de quelques pour
cents.
– Le jeu de caractères est “sans-état” (stateless), la signification d’un caractère ne dépendant pas d’un marqueur dans une séquence. Un caractère manquant dans la séquence
détruit la représentation du caractère mais pas plus, car on peut se re-synchroniser au
caractère suivant. C’est donc un code très robuste.
– La représentation d’un caractère ne peut pas être contenue dans la représentation d’une
chaîne plus grande, ce qui permet de faire des recherches de sous-chaînes par comparaison d’octets, comme sur les codages à un octet.
Les inconvénients :
6
– certaines opérations, comme “chercher le n-ième caractère d’une chaîne”, nécessitent un
parcours séquentiel.
1.11.3
UTF-16
Intermédiaire entre UTF-8 et UTF-32. La plupart des caractères sont sur 16 bits, les autres
sur 32.
1.12
BOM : Byte Order Mark
Pour tout compliquer, les ordinateurs travaillent souvent par mots de 2 ou 4 octets (16 ou 32
bits).
Dans un mot de 16 bits, on peut considérer que le premier octet est celui de poids fort, et le
second de poids faible. C’est la représentation dite “big-endian”. Mais on peut aussi considérer
l’inverse (little endian).
Les fichiers UTF peuvent commencer commencer par une marque “BOM” qui indique l’ordre
des octets dans les mots (de 16 ou 32 bits).
Bytes
Encoding Form
00 00 FE FF UTF-32, big-endian
FF FE 00 00 UTF-32, little-endian
FE FF
UTF-16, big-endian
FF FE
UTF-16, little-endian
EF BB BF
UTF-8
7