Redirection, Codage
Étudiants distants
Plusieurs commandes peuvent ne pas être installées sur la machine Linux que vous utilisez. Installez-les le cas échéant pour pouvoir faire les exercices.
Redirections
Un certain nombre de commandes Unix produisent des textes, ou des fichiers en sortie.
Question : comment récupérer les résultats dans un fichier, ou les faire traiter par une autre commande ?
Vers un fichier
Pour envoyer le résultat d’une commande dans un fichier, on ajoute l’indication de redirection
> fichier
sur la ligne de commande
Exemples :
$ ls -l >liste.txt
$ echo je suis $USER sur $HOSTNAME >message
$ anytopnm photo23.jpg >photo23.pnm
Remarques :
- on peut aussi mettre la redirection en début de commande
$ >liste.txt ls -l
- la redirection par
>
remplace le contenu précédent du fichier. - Avec
>>
, le contenu est préservé et les données redirigées étendent le fichier.
Depuis un fichier
Inversement, l’entrée d’une commande peut être prise dans un fichier.
Exemple :
$ tr [a-z] [A-Z] < prog.cc
Vers une autre commande
La sortie d’une commande peut également est utilisée comme entrée d’une autre commande. On peut faire:
$ ls -l | less
au lieu de
$ ls -l > liste.txt
$ less liste.txt
Ceci, bien sûr, parce que la commande less prend le texte qui lui arrive sur son «entrée standard» si on ne lui a pas indiqué de nom de fichier à traiter. C’est ce qu’on appelle faire un «pipeline» de deux commandes : la sortie de la première est raccordée à l’entrée de la suivante.
Applications évidentes :
$ ls -l | a2ps -Pinfo-421
$ ls -l | head
On peut enchaîner plusieurs commandes, et rediriger le résultat final vers un fichier. Par exemple :
$ anytopnm photo23.jpg | pnmtopng > image.png
au lieu de
$ anytopnm photo23.jpg >f.pnm
$ pnmtopng f.pnm >image.png
pour convertir un fichier vers le format PNG
Exercice :
- faites une capture d’écran
- en utilisant les commandes précédentes, et
pnmscale -w 100
, redimensionnez-la, au format JPEG (utilisezpnmtojpeg
)
Redirection de la sortie d’erreurs
Si vous écrivez un programme java avec des erreurs
public static void main(String[] args) {
}
et que vous voulez sauver une copie des messages d’erreurs par
javac buggy.java > erreurs.txt
ça ne marche pas. Le compilateur n’envoie pas les messages d’erreurs sur la sortie standard
(le System.out
que vous connaissez en java) mais sur la sortie d’erreur (System.err
) qui est distincte, même
si les deux s’affichent par défaut dans la fenêtre d’exécution.
Pour rediriger la sortie d’erreur, il faut faire :
javac buggy.java 2> erreurs.txt
Dans vos programmes java
, vous pouvez utiliser System.err
pour signaler les erreurs d’exécution,
l’affichage normal se faisant sur System.out
.
Exercice :
Ecrivez un programme java
minimal dont le main contient les lignes
System.out.println("texte qui sort par stdout");
System.out.println("texte qui sort par stdout");
et essayez les redirections.
Redirection de groupement de commandes
On met les commandes à regrouper entre accolades.
$ {
echo -n "contenu sauvegarde du "
date
tar -tf sauvegarde.tar
} > contenu.txt
On peut aussi grouper par des parenthèses. La différence subtile est expliquée dans la page manuel de bash.
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.
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 à 2 7 ) 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.
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 aussi sous le nom Latin 1. Il inclut les lettres accentuées nécessaires pour la plupart des lan- gages européens comme le français, l’allemand, l’espagnol, le norvégien.
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 Eu- rope 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
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)
- -t d1 : en décimal
- -t u1 : en décimal non signé
- -t x1 : en hexadécimal
Exercice
- Sous VSC , tappez quelques lignes de texte accentué. Sauvez le en encodage WESTERN ISO-8859-1 (CTRL-SHIFT P , encodage)
- 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 ?
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
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 e a c c e n t u 351 \n d
0000020 e d e u x l i g n e s \n
0000036
$ recode latin1..dos/crlf <texte >texte.dos
$ od -c texte.dos
0000000 t e x t e a c c e n t u 202 \r \n
0000020 d e d e u x l i g n e s \r \n
0000040
ou le codage avec d’autres conventions
$ recode latin1..html <texte >texte.html
$ od -c texte.html
0000000 t e x t e a c c e n t u & e a
0000020 c u t e ; \n d e d e u x l i
0000040 g n e s \n
0000045
$ recode latin1..latex <texte >texte.tex
$ od -c texte.html
0000000 t e x t e a c c e n t u \ ' e
0000020 \n d e d e u x l i g n e s \n
0000040
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.
Codes constructeurs
Chaque constructeur d’ordinateur a aussi développé ses propres codes non conformes aux standards internationaux (IBM EBCDIC, Windows-1252,..)
Exercice :
- Observez
echo coucou | recode latin1..ebcdic | od -t u1
. - Quel est le codage du saut de lignes ?
- même chose avec les chiffres ?
- que remarquez vous sur l’alphabet ?
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.
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 2 24 - 1).
UTF-32
Nous avons une numérotation des caractères : comment passer à une représentation bi- naire ? 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 ?
UTF-8
Le codage UTF-8 répond à ces besoins. L’idée est d’un codage à taille variable : les carac- tè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.
Number of bytes | Bits for code point | First code point | Last code point | Byte 1 | Byte 2 | Byte 3 | Byte 4 |
---|---|---|---|---|---|---|---|
1 | 7 | U+0000 | U+007F | 0xxxxxxx | |||
2 | 11 | U+0080 | U+07FF | 110xxxxx | 10xxxxxx | ||
3 | 16 | U+0800 | U+FFFF | 1110xxxx | 10xxxxxx | 10xxxxxx | |
4 | 21 | U+10000 | U+10FFFF | 11110xxx | 10xxxxxx | 10xxxxxx | 10xxxxxx |
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épen- dant 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. Les inconvénients :
- certaines opérations, comme “chercher le n-ième caractère d’une chaîne”, nécessitent un parcours séquentiel, puisqu’on ne peut pas prédire la taille occupée par le n-1 carac- tères précédents.
Exercice :
Avec code
, tapez un texte accentué que vous sauverez en UTF-8. Regardez-le
avec la commande od
UTF-16
Intermédiaire entre UTF-8 et UTF-32. La plupart des caractères sont sur 16 bits, les autres sur 32.