Jeu de caractères

IMPORTANT

Ce site web est un prototype en cours de construction, destiné à valider le code source généré par le logiciel Thot (version 0.0.1), projet personnel lui-même en phase de développement. Son contenu ainsi que son graphisme sont donc expérimentaux et n'ont de ce fait aucune valeur commerciale et/ou juridique. Pour obtenir plus d'information sur cet environnement, vous pouvez vous reporter à la page intitulée Questions fréquentes. Une page Facebook consacrée au projet peut par ailleurs être consultée. Un compte Twitter fournit des informations sur l'avancement du projet.

La notion de « jeu de caractères » (ou son pendant anglais “charset”) n'est pas forcément simple à appréhender. En effet, pour la plupart des utilisateurs sur un plan purement visuel un caractère reste un caractère à l'écran, rien de plus.

Pour comprendre de quoi il s'agit, il convient de quitter cet aspect visuel et se pencher sur la façon dont les caractères sont codés par un ordinateur. Plus précisément, il faut s'intéresser à la manière dont plusieurs ordinateurs vont pouvoir échanger le même texte en comprenant de quels caractères ce dernier est constitué.

C'est là qu'intervient la notion de « jeu de caractères », laquelle recouvre toutes les règles et normes qui vont être utilisées par le premier ordinateur pour « encoder » le texte en question et par le second pour le décoder lorsqu'il l'aura réceptionné.

Le but ici n'est pas de traiter en détail les différents jeux de caractères existants et la façon dont, techniquement, ils convertissent un texte en une suite d'octets pouvant être relus et, surtout, reconnus par un autre périphérique. Le lecteur souhaitant avoir de plus amples informations sur ce point précis pourra utilement se référer à la page Wikipedia consacrée à ce sujet.

Nous traitons plutôt ici la façon dont cette problématique, commune à tous les périphériques allant de l'ordinateur de bureau au téléphone portable, va être prise en compte et gérée pour qu'un serveur web délivre des pages HTML dans un encodage approprié, afin qu'elles n'occasionnent aucune anomalie lorsqu'elles seront relues par un navigateur.

Avant toute chose, il convient de rappeler que les pages HTML que nous visionnons en naviguant sur le web ne sont rien d'autre que des fichiers texte, respectant une norme certes mais restant intrinséquement un flux de caractères alignés les uns derrière les autres. Il convient donc de savoir très exactement de quelle manière ce flux a été créé en amont, par le serveur afin de pouvoir le relire correctement à son arrivée côté utilisateur.

Lorsqu'un caractère n'est pas correctement décodé par les navigateurs, ou absent de la police de caractères utilisée par le contexte dans lequel il est affiché, ce caractère est souvent remplacé par le symbole �, signalant qu'une anomalie s'est produite.

Le problème est donc in fine : comment indiquer le jeu de caractères devant être utilisé par le navigateur ? Pour y répondre, il y a deux manières distinctes pouvant être utilisées ensemble ou séparément :


Entêtes HTTP

Lorsqu'il est sollicité via une URL et que la ressource correspondante existe effectivement sur ce dernier, un serveur transmettra en retour un fichier, c'est à dire un flux de caractères sérialisés dans un format pouvant être reconnu et décodé par le navigateur web ayant envoyé la demande initiale.

À défaut d'indication contraire, la norme HTML5 précise que ce flux de données est réputé être encodé en UTF-8. Toutefois, il est vivement recommandé de lever toute ambiguïté quant au jeu de caractères utilisé, et ceci peut se faire via l'entête HTTP content-type.

Pour mémoire, il est rappelé ici que les entêtes HTTP sont des couples d'information de type clé + valeur, renvoyés en même temps que la page HTML par un serveur web et permettant de spécifier un contexte particulier tel que le type de contenu transmis, sa taille, etc.

La norme RFC 2616, référence officielle des entêtes HTTP pouvant être retournés par un serveur web lorsqu'une ressource lui est demandée, précise que la valeur associée au mot clé « content-type » est un « type mime », c'est à dire un code identifiant le type de données transmises dans le flux.

Un type mime comporte obligatoirement un type de base (ex. text/html) précisant la nature globale du flux, mais peut également comporter un ou plusieurs paramètres connexes précisant certaines caractéristiques dudit flux. C'est notamment le cas du paramètre « charset », permettant d'indiquer le jeu de caractères ayant été utilisé par le serveur web pour encoder la ressource.

Ainsi, par exemple le contenu d'une page web ayant été encodée en UTF-8 sera spécifié dans les entêtes HTTP sous la forme suivante :

Content-Type: text/html;charset=utf-8


Balise HTML <meta>

En complément de la technique précédente, il est aussi possible d'indiquer au navigateur web le jeu de caractères utilisé par une page HTML, en renseignant l'une des balises prévues pour l'indication de métadonnées.

Ces balises, présentes dans la section <head> de la page, contiennent un certain nombre d'informations n'apparaissant pas lors de l'affichage par le navigateur mais qui fournissent des données complémentaires (ex. références aux réseaux sociaux, initialisation de la zone d'affichage, etc.).

L'initialisation du jeu de caractères se fait alors en plaçant une balise <meta> identique à celle indiquée ci-dessous, toujours avec ici pour exemple un encodage en UTF-8 :

<meta charset="utf-8"/>

Cette balise est en règle générale placée immédiatement au début de la section <head>, car sa prise en compte conditionne le décryptage correct d'autres balises présentes dans cette section (ex. titre de la page).


Erreur fréquente

Une erreur fréquemment commise consiste à considérer que la déclaration du jeu de caractères, qu'elle soit faite via les entêtes HTTP ou les métadonnées de la page web, se suffit à elle-même pour que la ressource soit correctement relue par le navigateur à qui elle est destinée.

Ce n'est pas le cas.

En fonction du jeu de caractères qui aura été déclaré, chaque caractère constituant le document HTML va être sérialisé selon un codage qui utilisera un ou plusieurs octets consécutifs. Il est donc primordial que cette organisation des octets soit en phase avec ce qui aura été déclaré.

La quasi totalité des éditeurs de texte permettent, lorsqu'on enregistre un document, de sélectionner le jeu de caractères devant être utilisé pour son stockage. Ce choix influe par ailleurs sur la taille du fichier en lui-même, puisqu'il faudra plus ou moins d'octets pour sérialiser ce flux de caractères sur disque.

Jeu de caractère sélectionné au moment de l'enregistrement et déclarations envoyées par le serveur ayant fourni la page web doivent donc être en parfaite adéquation pour que le navigateur, une fois la page reçue, puisse la décrypter et l'afficher correctement à l'utilisateur.


Comment procède le générateur ?

Le générateur de sites web Thot identifie quel jeu de caractères doit être utilisé à partir de la propriété correspondante, définie au niveau de la configuration du projet. Il renseigne ensuite automatiquement les entêtes HTTP, ainsi que les métadonnées de chaque page, avec la bonne valeur.

Indiquer le jeu de caractères étant nécessaire mais pas suffisant, le générateur s'assure également que la sérialisation des pages est conforme et respecte l'encodage des caractères sélectionné. Il ne peut donc pas y avoir décalage entre déclaration et flux effectivement transmis au navigateur.

Convertir l'ensemble des ressources d'un site web pour passer, par exemple, d'un jeu de caractères ISO-8859-1 à UTF-8 est donc d'une part très simple, puisque cela se résume à modifier une propriété au niveau de la configuration projet et d'autre part fiable puisqu'on a la garantie que tous les flux impactés seront effectivement encodés de façon correcte.

Le gain en rapidité et conformité est évident par rapport à la même opération effectuée de façon manuelle, car cette dernière aurait nécessité qu'un intervenant passe sur chaque ressource pour :

Le niveau de qualité du site web généré demeure donc constant, quel que soit le nombre de pages que comporte le site en question.

Image bouton cliquable permettant le retour en haut de page