Retour sommaire

Masquer apartés
Notions abordées

Codage des caractères

Dans le code de vos pages html, vous avez indiqué :

<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />

Nous allons nous intéresser à la partie "charset=UTF-8"

Codage ASCII

Un fichier contient une représentation de données. Par exemple un fichier peut contenir une représentation d'un texte (mais aussi d'une image, d'un son ...). Bien souvent on dit plus simplement que le fichier contient le texte.

Un caractère peut être une lettre, un chiffre, une ponctuation, tout autre symbole accessible via les touches de votre clavier, etc.

Le contenu du fichier n'est lui-même qu'une suite de 0 et de 1, des bits. On choisit donc de coder chacune des lettres, plus généralement chacun des caractères, par une représentation binaire.

Ce choix d'utiliser un codage donné est arbitraire.

Historiquement, le codage ASCII a été défini et utilisé pour écrire des textes en anglais.

La table ASCII fournit la correspondance entre 128 caractères et leur représentation binaire. Les caractères sont numérotés de 0 à 127. A priori, 7 bits suffisent à coder ces caractères, en effet 128 = 27. En pratique, les ordinateurs travaillent presque tous sur des multiples de 8 bits, ce que l'on nomme octet. Chacun des 128 caractères ASCII est donc codé par un octet dont le 8ème bit est à 0.

Observez la table ASCII. On remarque que certains caractères de la table ASCII sont des caractères dits de contrôle, ils ne sont pas imprimables ou ne peuvent pas être affichés.)

On pourra aussi consulter http://fr.wikipedia.org/wiki/ASCII.

La représentation binaire du caractère 'a' est (0110 0001)2. Cette valeur binaire correspond à 97 en décimal. On dit que le code ASCII de 'a' est 97. De même, 'z' est représenté par (0111 1010)2, qui correspond à 122 en décimal. Le code ASCII de 'z' est 122.

On remarque aussi que les chiffres sont présents dans la table ASCII, ce sont des caractères "comme les autres", la représentation binaire du caractère '1' est par exemple (0011 0001)2, le code ASCII de '1' est donc 49.

Donnez la représentation binaire ASCII du texte suivant :

Bonjour !

On utilise la table ASCII. C'est laborieux...

0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
0000 NUL SOH STX ETX EOT ENQ ACK BEL BS HT LF VT FF CR SO SI
0001 DLE DC1 DC2 DC3 DC4 NAK SYN ETB CAN EM SUB ESC FS GS RS US
0010 SP ! " # $ % & ' ( ) * + , - . /
0011 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
0100 @ A B C D E F G H I J K L M N O
0101 P Q R S T U V W X Y Z [ \ ] ^ _
0110 ` a b c d e f g h i j k l m n o
0111 p q r s t u v w x y z { | } ~ DEL

Solution

01000010 01101111 01101110 01101010 01101111 01110101 01110010 00100000 00100001

Quel est le nombre de caractères du texte dont la repésentation binaire ASCII est la suivante :

0100001001110010011000010111011001101111

Quel est ce texte ?

Il est pas commode, pour un humain, de manipuler des représentations binaires. Pour faciliter les choses on regroupe les séquences de 4 bits en une valeur hexadécimale. En effet, les valeurs binaires de '0000' à '1111' correspondent aux 16 valeurs hexadécimales '0', '1', ... '9', 'A', 'B', 'C', 'D', 'E', et 'F'. Par la suite, ces chiffres et lettres seront appelés chiffres hexadécimaux.

Complétez la table suivante

0 - 0000        4 - 0100        8 - 1000        C -     
1 -             5 -             9 -             D - 1101
2 -             6 -             A -             E -     
3 -             7 -             B -             F -     

Les caractères ASCII sont représentés sur 8 bits. Tout caractère ASCII peut donc être représenté par deux chiffres hexadécimaux. Notre caractère 'a' sera représenté par la valeur hexadécimale (61)16, alors que 'z' sera représenté par la valeur hexadécimale (7A)16. Comme nous ne sommes pas dans le système décimal, nous ne pouvons pas parler de dizaine et d'unité, les termes de poids fort et faible sont utilisés (7 est le poids fort et A le poids faible pour 'z').

Une autre vue de la table ASCII : Les entêtes des lignes représentent les poids forts et ceux des colonnes sont les poids faibles. Une case donne donc la lettre correspondant à la valeur hexadécimale représentée par les poids des lignes et colonnes. Cf http://en.wikipedia.org/wiki/File:ASCII_Code_Chart.svg

Un éditeur hexadécimal permet d'afficher, les données sous forme hexadécimal (ou binnaire) d'un fichier. C'est à dire que l'on peut voir ce qui est vraiment enregistré dans le fichier, sans qu'il y ait de traduction. (traduction du binaire en caractère en utilisant le dictionnaire ASCII par exemple). Créer un document texte avec Notpad++. Ecrivez :

Enregistrer ce texte en tant que « texte brut » (extension .txt) en précisant ANSI dans la rubrique codage. Observez ce qui est vraiment enregistré en utilsant Hex Editor Néo(liens dans le répertoire ISN du bureau). (Lancer Hex Editor Néo, puis Fichier puis Ouvrir).

Par défaut, l'affichage se fait en hexadécimal (car c'est plus facile à lire pour un humain, mais, on peut afficher les données sous forme binaire (menu Affichage > Afficher comme)

Donner le codage en ASCII hexadécimal de ce texte :

Je code en binaire !

Codage ASCII étendu

La nécessité de représenter des textes comportant des caractères non présents dans la table ASCII tels ceux de l'alphabet latin utilisés en français comme le 'à', le 'é' ou le 'ç' impose l'utilisation d'un autre codage que l'ASCII.

Plusieurs propositions de codage coexistent.

Afin de faciliter les choses, ces propositions sont des extensions du codage ASCII :

Mais les 8 bits de l'octet vont être utilisés. Cela permet de coder 28 = 256 caractères, soit 128 caractères supplémentaires.

L'ISO, organisation internationale de normalisation, propose de son côté plusieurs variantes de codages adaptées aux différentes langues. La plus utilisée concerne les langues européennes occidentales. Il s'agit de l'ISO-8859-1, aussi nommé ISO-Latin1.

Microsoft propose le codage dit Windows-1252 (encore appelé ANSI, bien que cela puisse paraître abusif, l'ANSI, American National Standards Institute, n'ayant jamais validé cette table !). Ce codage ne diffère de l'ISO-8859-1 que pour quelques caractères tels le signe euro, €, la ligature o-e, œ, ou certains guillemets qui utilisent des codes réservés par ISO-Latin-1 pour des caractères de contrôle.

Les tables Windows-1252 (cf http://fr.wikipedia.org/wiki/Windows-1252) et ISO-Latin1 (cf http://fr.wikipedia.org/wiki/ISO_latin_1).

Plus loin avec les codages UTF

À l'évidence, 256 caractères ne suffisant pas pour représenter les lettres de tous les alphabets utilisés (pensons au russe, à l'hébreu, etc.), un nouveau standard a été introduit : Unicode. La table Unicode comporte la définition de près de cent cinquante mille caractères.

Le codage de cette table est multiple. Le codage le plus couramment utilisé se nomme UTF-8. Son principe est le suivant : une première série de caractères sont codés sur un octet. D'autres caractères sont codés sur deux octets, le premier octet débute par '110' pour l'indiquer, l'octet suivant débute par '10'. De même des codages sur 3 ou 4 octets sont utilisés pour d'autres caractères. (Cette rapide introduction à UTF-8 est volontairement simplifiée.)

Définition du nombre d'octets utilisés
Représentation binaire UTF-8 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 128 premiers caractères de la table UTF-8 sont compatibles avec le codage ASCII. Ainsi le codage UTF-8 d'un texte ne comportant que des caractères présents dans la table ASCII sera le même que le codage ASCII de ce texte.

Ce ne sera pas vrai pour un texte ISO-Latin-1.

Il importe donc, quand on veut décoder un texte, de savoir quel est le codage utilisé sous peine de décoder improprement les caractères.

Dire que le codage UTF-8 de 'é' est 'C3~A9' est un raccourci qui fait l'impasse sur la notion de point de code. Plus précisément, un codage intermédiaire, nommé point de code est associé à chaque caractère. On parle de codage Unicode (et non UTF-8). Pour 'é' il s'agit de '00 E9'. En binaire cela correspond à '11101001'. Les chiffres binaires du point de code sont rangés aux positions 'x' dans le schéma suivant de codage sur deux octets '110xxxxx 10xxxxxx'. On obtient donc '11000011 10101001'. C'est bien la valeur hexadécimale 'C3 A9' annoncée.

On lit dans une table UTF-8 que le caractère 'é' est codé sur deux octets par les valeurs hexadécimales 'C3 A9' et le caractère '€' sur 3 octets par les valeurs hexadécimales 'E2 82 AC'.

Soit un fichier contenant le texte "J'écris € en UTF-8" codé en UTF-8. Quel sera le texte affiché si un logiciel décode ce texte en supposant que le codage utilisé est Latin-1 ?

Codage des caractères et HTML

Jeu de caractères

La norme HTML/CSS prévoit la possibilité d'indiquer le codage utilisé pour les caractères d'un fichier donné. Le codage utilisé est précisé par une valeur du tag <meta>, comme dans l'exemple :

<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
</head>

<body>

<p>J'écris € en UTF-8.</p>

</body>
</html>
Expérimentez par exemple avec http://www.w3schools.com, en particulier http://www.w3schools.com/tags/tryit.asp?filename=tryhtml_charsets.

Dans le navigateur (Pour FireFox : Affichage puis Encodage des caractères), imposer au navigateur d'utiliser pour décoder la page un encodage différent de celui utilisé pour encoder le fichier, et observer le résultat.

Lors de la définition d'une page HTML, il est important de préciser l'encodage des caractères utilisés. À défaut, le navigateur web utilisera un encodage par défaut qui ne correspondra pas nécessairement à l'encodage utilisé pour écrire le fichier.

Entités de caractère HTML

Pour certains caractères difficiles à saisir ou pour éviter les problèmes de codage des caractères, il est possible, en HTML, de coder les caractères par des suites de caractères ASCII, appelées entités HTML. Par exemple, ’&eacute;’ pour ’é’ ou ’&euro;’ pour ’€’.

Toutes les entités commencent par & et terminent par ;

Le W3C impose de pas utiliser de caractères accentués dans le head d'une page HTML, et de les remplacer par leur entités HTML. Vous en aurez aussi besoin pour les URL (voir en dessous) et pour pouvoir écrire des balises dans un texte. Il faut alors remplacer < par &lt; et > par &gt;. Le code sera affiché comme un simple texte.

On évitera d'abuser de ce codage ASCII des caractères, son usage intempestif rend le code source HTML peu lisible.

La table http://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references liste l'ensemble des codes HTML de caractères.
Modifiez le code HTML précédent pour utiliser uniquement l'encodage ASCII et produire notre phrase habituelle "J'écris € en UTF-8".

Codage des URL

Une URL est l'adresse d'une page web. Par exemple http://fr.wikipedia.org/wiki/URL.

Certains caractères peuvent poser problème dans une URL, car ce sont des caractères qui ont une signification particulière dans une URL. Par exemple, le slash permet de spécifier un sous-répertoires, les caractères & et ? servent à l'envoi de données par formulaires...). Enfin les URL peuvent être inclus dans un document HTML, ce qui rend difficile l'insertion de caractères tels que < ou ≶ dans l'URL.

CaractèreCodage URL
Tabulation %09
Espace %20
" %22
# %23
% %25
& %26
( %28
) %29
+ %2B
, %2C
. %2E
/ %2F
: %3A
; %3B
< %3C
= %3D
> %3E
? %3F
@ %40
[ %5B
%5C
] %5D
^ %5E
' %60
{ %7B
%7C
} %7D
~ %7E

Remarque : il faut remplacer & par &amp; dans l'adresse si celui-ci indique la séparation entre deux variables passées en paramètre, mais le remplacer par %26 si la valeur du paramètre contient &

Les accents dans les nom de domaine arrivent en France !

A lire pour plus de détail

Nom de domaine internationalisé

En faisant un copier-coller directement dans la barre d'adresse, observé comment FireFox, convertit les adresses qui contiennes des caractères non définis dans le code ASCII

http://fr.wikipedia.org/wiki/Salon_de_beauté

http://ps.wikipedia.org/wiki/فارسي

A quoi correspondent les codes de remplacement ?

Suite: Codage des couleurs