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