Le codage des nombres et des caractères
Le codage des informations
Qu'est ce que le code ASCII ?
La mémoire de l'ordinateur conserve toutes les données sous forme numérique Il n'existe pas de méthode pour stocker directement les caractères. Chaque caractère posséde donc son équivalent en code numérique : c'est le code ASCII (American Standard Code for Information Interchange) - traduisez ''Code Americain Standard pour l'Echange d'Informations''). Le code ASCII de base représentait les caractères sur 7 bits (c'est-à-dire 128 caractères possibles, de 0 à 127).
Table des caractères ASCII Etendue
Le code ASCII a été; mis au point pour la langue anglaise, il ne contient donc pas de caractères accentués, ni de caractères spécifiques à une langue. Pour coder ce type de caractère il faut recourir à
un autre code. Le code ASCII a donc été étendu à 8 bits (un octet) pour pouvoir coder plus de caractéres
(on parle d'ailleurs de code ASCII étendu...).
Ce code attribue les valeurs 0 à 255 (donc codées sur 8 bits, soit 1 octet) aux lettres
majuscules et minuscules, aux chiffres, aux marques de ponctuation et aux autres symboles (caractéres accentués dans le cas du code
iso-latin1).
Le code ASCII étendu n'est donc pas unique et dépend fortement de la plateforme utilisée.
Les deux jeux de caractéres ASCII étendus les plus couramment utilisés sont :
Le code ASCII étendu ANSI, utilisé par les systèmes d'exploitation récents
Le code EBCDIC (Extended Binary-Coded Decimal Interchange Code), développé par IBM, permet de coder des caractères sur 8 bits. Bien que largement répandu sur les machines IBM, il n'a pas eu le succès qu'a connu le code ASCII.
Le code Unicode est un système de codage des caractères sur 16 bits mis au point en 1991. Le système Unicode permet de représenter n'importe quel caractère par un code sur 16 bits, indépendamment de tout système d'exploitation ou langage de programmation. Au lieu d'utiliser seulement les codes 0 à 127, il utilise des codes de valeur bien plus grandes. Le code UNICODE permet de représenter tous les caractères spécifiques aux différentes langues. De nouveaux codes sont régulièrement attribués pour de nouveaux caractères: caractères latins (accentués ou non), grecs, cyrillics, arméniens, hébreux, thaï, hiragana, katakana... L'alphabet Chinois Kanji comporte à lui seul 6879 caractères.Il regroupe ainsi la quasi-totalité des alphabets existants (arabe, arménien, cyrillique, grec, hébreu, latin, ...) et est compatible avec le code ASCII. L'Unicode définie donc un correspondance entre symboles et nombres. Même si l'UNICODE est bien conçu, il reste assez peu utilisé par rapport à l'ASCII. (Ne vous amusez pas à envoyer un message en UNICODE à quelqu'un : il ne saurait probablement pas comment le lire !). Pour les programmeurs, ça n'est pas toujours très facile à manipuler non plus. L'ensemble des codes Unicode est disponible sur le site http://www.unicode.org.
Unicode, dans la théorie, c'est très bien. Mais dans la pratique, c'est une autre paire de manches:
Généralement en Unicode, un caractères prend 2 octets. Autrement dit, le moindre texte prend deux fois plus de place qu'en ASCII. C'est du gaspillage. De plus, si on prend un texte en français, la grande majorité des caractères utilisent seulement le code ASCII. Seuls quelques rares caractères nécessitent l'Unicode. On a donc trouvé une astuce: l'UTF-8.
Un texte en UTF-8 est simple: il est partout en ASCII, et dès qu'on a besoin d'un caractère appartenant à l'Unicode, on utilise un caractère spécial signalant "attention, le caractère suivant est en Unicode". Par exemple, pour le texte "Bienvenue chez Sébastien !", seul le "é" ne fait pas partie du code ASCII. On écrit donc en UTF-8: im1 Pour être rigoureux, on indique quand même au début du fichier que c'est un fichier en UTF-8 à l'aide de caractères spéciaux: im2
L'UTF-8 rassemble le meilleur de deux mondes: l'efficacité de l'ASCII et l'étendue de l'Unicode. D'ailleurs l'UTF-8 a été adopté comme norme pour l'encodage des fichiers XML. La plupart des navigateurs récents supportent également l'UTF-8 et le détectent automatiquement dans les pages HTML.
Un entier relatif est un entier pouvant être négatif. Il faut donc coder le nombre de telle façon que l'on puisse savoir s'il s'agit d'un nombre positif ou d'un nombre négatif, et il faut de plus que les règles d'addition soient conservées. L'astuce consiste à utiliser un codage que l'on appelle complément à deux. Un entier relatif positif ou nul sera représenté en binaire (base 2) comme un entier naturel, à la seule différence que le bit de poids fort (le bit situé à l'extrême gauche) représente le signe. Il faut donc s'assurer pour un entier positif ou nul qu'il est à zéro (0 correspond à un signe positif, 1 à un signe négatif). Ainsi si on code un entier naturel sur 4 bits, le nombre le plus grand sera 0111 (c'est-à-dire 7 en base décimale). Principe du complément à deux : On doit représenter un nombre négatif. Prenons son opposé (son équivalent en positif) On le représente en base 2 sur n-1 bits On complémente chaque bit (on inverse, c'est-à-dire que l'on remplace les zéros par des 1 et vice-versa) On ajoute 1 On remarquera qu'en ajoutant le nombre et son complément à deux on obtient 0 (voir les règles d'addition) Voyons maintenant cela sur un exemple : On désire coder la valeur -5 sur 8 bits. Il suffit : d'écrire 5 en binaire : 00000101 de complémenter à 1 : 11111010 d'ajouter 1 : 11111011 la représentation binaire de -5 sur 8 bits est 11111011
Il s'agit d'aller représenter un nombre binaire à virgule (par exemple 101,01 qui ne se lit pas cent un virgule zéro un puisque c'est un nombre binaire mais 5,25 en décimale) sous la forme 1,XXXXX... * 2^n (c'est-à-dire dans notre exemple 1,0101*2^2). La norme IEEE définie la façon de coder un nombre réel. Cette norme se propose de coder le nombre sur 32 bits et définit trois composantes : le signe est représenté par un seul bit, le bit de poids fort (celui le plus à gauche) l'exposant est codé sur les 8 bits consécutifs au signe la mantisse (les bits situés après la virgule) sur les 23 bits restants Ainsi le codage se fait sous la forme suivante : seeeeeeeemmmmmmmmmmmmmmmmmmmmmmm le s représente le bit relatif au signe les e représentent les bits relatifs à l'exposant les m représentent les bits relatifs à la mantisse Certaines conditions sont toutefois à respecter pour les exposants : l'exposant 00000000 est interdit l'exposant 11111111 est interdit. On s'en sert toutefois pour signaler des erreurs, on appelle alors cette configuration du nombre NaN, ce qui signifie Not a number Il faut rajouter 127 (01111111) à l'exposant pour une conversion de décimal vers un nombre réel binaire. Les exposants peuvent ainsi aller de -254 à 255
La formule d'expression des nombres réels est ainsi la suivante: (-1)^S * 2^( E - 127 ) * ( 1 + F ) où: S est le bit de signe et l'on comprend alors pourquoi 0 est positif ( -1^0=1 ). E est l'exposant auxquel on doit bien ajouter 127 pour obtenier son équivalent codé. F est la partie fractionnaire, la seule que l'on exprime et qui est ajoutée à 1 pour effectuer le calcul. Voyons ce codage sur un exemple : Soit à coder la valeur 525,5. 525,5 est positif donc le 1er bit sera 0. Sa représentation en base 2 est la suivante : 1000001101,1 En normalisant, on trouve : 1,0000011011*2^9 On ajoute 127 à l'exposant qui vaut 9 ce qui donne 136, soit en base 2 : 10001000 La mantisse est composée de la partie décimale de 525,5 en base 2 normalisée, c'est-à-dire 0000011011. Comme la mantisse doit occuper 23 bits, il est nécessaire d'ajouter des zéros pour la compléter : 00000110110000000000000 La représentation du nombre 525,5 en binaire avec la norme IEEE est donc : 0 1000 1000 00000110110000000000000 0100 0100 0000 0011 0110 0000 0000 0000 (4403600 en hexadécimal) Voici un autre exemple avec un réel négatif : Soit à coder la valeur -0,625. Le bit s vaut 1 car 0,625 est négatif 0,625 s'écrit en base 2 de la façon suivante : 0,101 On souhaite l'écrire sous la forme 1.01 x 2-1 Par conséquent l'exposant vaut 1111110 car 127 - 1 = 126 (soit 1111110 en binaire) la mantisse est 01000000000000000000000 (seuls les chiffres après la virgule sont représentés, le nombre entier étant toujours égal à 1) La représentation du nombre 0,625 en binaire avec la norme IEEE est : 1 1111 1110 01000000000000000000000 1111 1111 0010 0000 0000 0000 0000 0000 (FF 20 00 00 en hexadécimal)
Si vous mettez directement le caractère "é" dans une page web, ce n'est pas bien. ll faut obligatoirement choisir une des 3 solutions suivantes: soit utiliser les entités HTML, et donc mettre é à la place de "é". soit laisser le "é" tel quel et préciser le charset que vous utilisez au début du fichier HTML (dans la balise
): (ISO-8859-1 est le jeu de caractère latin courant sous Windows.) soit travailler directement en UTF-8 dans votre éditeur HTML (s'il le permet). Ajoutez alors: L'ISO-8859-1 convient pour la plupart des langues latines ou occidentales (anglais, français, allemand, espagnol...), et l'UTF-8 vous sera indispensable pour les autres langues (japonais, hébreu, etc.). A vous de choisir en fonction de vos besoins.