(jeux de) Caractères, codes et références

Il arrive parfois qu’un navigateur affiche des caractères bizarresà l’écran, soit lorsque vous naviguez sur un site Internet , soit lorsque vous recevez un webmail (� fortiori si votre ami possède un PC et vous un mac…).
Ce chapitre devrait (normalement) vous permettre d’y voir un peu plus clair et vous éviter autant que faire se peut ce genre de problèmes…

Un peu de français

Tout le monde sait que notre langue a un alphabet de 26 caractères…mais en utilise en fait 42 !!.
Pour mémoire, les voici :

a b c d e f g h i j k l m n o p q r s t u v w x y z
à â é è ê ë î ï ô ù û ü ÿ ç æ œ

note : il se peut que les ligatures ‘ae’ et ‘oe’, apparaissent bizarrement ci dessus , cela proviendar soit du code des caractères de votre poste, soit de la police par défaut de votre navigateur, c’est justement ce que nous allons voir plus loin …

A cela s’ajoute bien sur les MAJUSCULES correspondantes et les caractères de ponctuation : virgule, point-virgule, deux-points, point, point dexclamation et point d’interrogation et les apostrophes et les guillemets et l’espace !
Et nous voila déjà rendus à 91 caractères pour écrire strictement notre langue, d’un point de vue purement littéraire (sans symbole exotique).
On attendra donc d’un document rédigé en Français qu’il puisse représenter tous ces caractères…

Pour l’anecdote, et pour vous permettre de faire des tests d’affichage et d’impression, voici parmi les plus petites phrases intelligibles en Français qui regroupent tous les caractères de l’alphabet (ce la s’appelle un pangramme) accentués ou non :

<< portez ce vieux whisky au juge blond qui fume >>

37 caractères ! Essayez de faire mieux !
et avec tous les caractères du Français :

< Dès Noël où un zéphyr haï me vêt de glaçons würmiens
je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr
& cætera ! >>

Pour ceux intéressés par les règles d’écrture typographiques voir l’excellent document de Jacques André sur : http://jacques-andre.fr/faqtypo/lessons.pdf

et pour les pangrammes un petit essai perso : http://dd.estsurinternet.com/archives/category/oulipoesies/

Rappel sur le codage des caractères

Les caractères affichés à l’écran ou imprimés sont stockés comme toutes les informations au format binaire. Il est donc nécessaire d’utiliser un code, une table de correspondance, si possible standard pour associer un nombre binaire (compréhensible par l’ordinateur) à chaque caractère (compréhensible par vous et moi).

Quelques codes très courants :

  • ASCII
    Le plus connu et historiquement le premier code est Américain, ‘est le code ASCII. Il stocke les caractères sur 7 bits, et peut donc par définition en représenter au maximum 128 ! l’ ASCII comprend essentiellement les caractères aphabétiques non accentués, en majuscule et en minuscule, les chiffres, quelques signes de ponctuation,(en tout 95 caractères imprimables) et quelques caractères de contrôle non imprimables.
  • MS-DOS ou PC ou IBM CP437
    le jeu de caractère du PC (au départ…), contient 256 caractères , codé sur 8 bits donc. En plus de l’ASCII, il propose : des caractères accentués, des caractères graphiques (smileys, encadrements de boite), quelques caractères grecs et symboles mathématiques
  • ISO-8859-1
    Une extension de l’ASCII y ajoutant les caractères accentués. Comprend 191 caractères utilisés dans une vingtaine de pays en en Europe de l’Ouest. Autre nom : ‘Latin 1’. Ne comprend pad le caractère ‘euro’ , ni la ligature oe…
  • ISO-8859-15
    Idem au 8859-1, avec quelques caractères majuscules accentués, la ligature OE et l’EURO en plus ! Moins fréquemment utilisé que le précédent…malheureusement
  • Windows-1252 ou CP1252 ou ANSI
    utilisé sur les postes…Windows, et don très répandu, stockage sur 8bits. Remplace les caractères de controle de l’ASCII (partie basse du code) par des caractères imprimables.
    Il est assez proche de ISO-8859-15, offre l’euro , la ligature oe, le caractère ‘pour mille’
  • (Unicode)
    Unicode est en fait une norme UNIVERSELLE , qui nomme explicitement et numérote (avec un ‘code point’ en hexadecimal) les caractères des différents alphabets des langues écrites dans le monde : + de 130 000 caractèresertoriés en version 5,.
    On compte 245 000 signes si l’on inclut la ponctuation, les symboles, les chiffres, les idéogrammes. Les langages représentés incluent par exemple l’Arabe, le bengali, le Cherokee, l’Hebreu, le Grec, le Thaï, le Tibétain, le Latin (pour les langues d’Europe de l’Ouest)
  • UTF8, une des formes d’encodage de Unicode, qui stocke les caractères sur 1, 2, 3 ou 4 octets. (UTF16 et UTF32 sont stockés fixement sur 2 octest ou 4 octets, et 4 octets respectivement)
    Le code le plus large et le plus universel, supporte aisément les documents multilingues

Jeux de caractères standards HTML

HTML 4.01 supporte le jeu de caractères ISO-8859-1 (Latin-1)

Tous les caractères non ASCII de ISO-8859-1 sont des caractères spéciaux :

  • des symboles, monétaires ou autres
  • des caractères accentués francais, allemands, islandais,…
  • des exposants,
  • des signes de ponctuation exotiques

Tous ces caractères non ASCII peuvent être saisis directement (si l’encodage et le clavier le permettent) ou représentés en HTML par des références.

Les références de caractères ou ‘character references’

Comme nous l’avons dit précédemment certains caractères spéciaux ne peuvent être écrits directement dans une page HTML.
Ainsi le caractère ‘<‘ est un caractère réservé en HTML qui sert � marquer le début d’une balise. Si l’on veut faire apparaître ‘<‘ dans un document, ou plus généralement que des caractères spéciaux s’affichent normalement dans le navigateur, il faut utiliser une référence de caractère.

Il ya 2 formes possibles pour référencer un caractère : avec son nom abrégé (entité) ou avec un code numérique décimal ou hexadécimal. Dans tous les cas on commencera l’entité par un ‘&’ et on la terminera par un ‘;’

Ainsi le caractère ‘<‘ , pourra se noter indifféremment :

  • & lt; (les lettres lt voulant dire ‘less than’ ou ‘plus petit que’ en anglais)
  • & #60;
  • & #x3c;

exemple :

‘<‘ est le caractère noté en HTML ‘& lt;’
mais aussi ‘& #60;’
il est possible de mettre des espaces (la preuve) au milieu d’un texte
avec ‘& nbsp;’

notes :
– A la différence des balises HTML les références sont sensibles � la casse. Ainsi é est différent de É (qui est le ‘E’ majuscule accentué !)

– ‘nbsp’ veut dire ‘non breakable space’ qui est un espace un peu spécial, car insécable. Il est utile en typographie pour précéder les ‘!’ ou les ‘;’ et ne pas risquer de les trouver renvoyés dans le texte à la ligne suivante
Les références de caractères sont en fait une façon d’écrire des caractères spéciaux (non ASCII en gros) …en n’utilisant que des caractères ASCII : des lettres, des chiffres, un ‘&’ et un ‘;’.
L’intérêt de cette représentation est qu’elle est indépendante du paramétrage du serveur web et du client (le navigateur) et notamment de la façon dont sont encodés les caractères.
Les références les plus utilisées en pratique, en HTML, sont les caractères ‘<‘, ‘>’, ‘&’. Et aussi ‘ ‘ : l’espace insécable et le désormais célèbre ‘&eolig; (ligature eo) absent de quelques codes standard

Quelques références classiques sont présentées dans le tableau suivant

Resultat Description nom de l’entité code entité
  espace & nbsp; & #160;
< inférieur & lt; & #60;
> supérieur & gt; & #62;
& et commercial & amp; & #38;
«  double quote & quot; & #34;
simple quote & apos; & #39;
œ e dans l’o & eolig; & #339;
§ paragraphe & sect; & #167;
© copyright & copy; & #169;
÷ division & divide; & #247;
è e accent grave & egrave; & #232;
é e accent aigu & eacute; & #233;
ê e accent circonflexe & ecirc; & #234;
a accent grave & agrave; & #224;
euro & euro; & #8364;

Une liste complète des entités est dçon sont isponible sur le site de W3schools :
HTML Entities Reference.

L’encodage des caractères en HTML

Les caractères spéciaux nécessitent d’être encodés.

L’encodage utilisé peut être précisé � 3 niveaux :

  • au niveau de l’entête HTTP du serveur
    Pratique car centralisé pour toutes les pages HTML. Cette entête peut être spécifiée en configurant le serveur Web lui même (directive apache par exemple) … si c’est possible !
  • au niveau de la page elle même, dans l’entête, en utilisant la balise ‘meta’ et l’attribut ‘content’ :
    < meta http-equiv= »Content-Type » content= »text/html; charset=utf-8″/>
  • au niveau du navigateur
    Cette dernière option n’aura d’effet que si aucune méthode d’encodage n’a été précisée en amont !

On pourra utiliser l’un des codes standards vus précédemment UTF8, 8859-1 par exemple.
Voici un exemple de déclaration dans l’entête d’une page :

<HTML>
<HEAD>
<meta http-equiv= »Content-Type » content= »text/html; charset=iso-8859-1″>
….
</HEAD>
<BODY>

Paramétrer le navigateur

Par défaut votre navigateur utilise un certain type de langue, de jeux de caractères et d’encodage.
Pour Firefox par exemple, les options par défaut peuvent être vérifiées et modifiées dans le menu Outils / Options / Contenu. On voit la police par défaut utilisée et sa taille, et en cliquant sur le bouton ‘avancé’ on obtient les infos suivantes (pour un Firefox version Française) :

caractères sous firefox

On peut également voir et modifier l’encodage dans le menu affichage / encodage des caractères.
Comme dit précédemment tout changement sera effectif seulement si ni le serveur, ni le document n’ont précisé d’encodage avant…

Quelques conseils concrets…

  • Utilisez si possible UTF-8 , vous pourrez en plus, créer des documents multilingues : Francais + Arabe ou Francais + Hebreu, par exemple dans la même page
  • en deuxième choix, pour des docs françaises, l’encodage ISO-8859-1, dit aussi ‘Latin-1’ ou l’encodage ISO-8859-15 si vous avez besoin d’afficher des Euros…DAns ces 3 cas, tous les caractères accentués classiques seront saisis directement sans passer par des références de caractères
  • réservez les références de caractère � ‘<‘, ‘>’ et ‘&’
  • déclarez le type d’encodage souhaité dans les documents créés
  • vérifiez l’encodage du logiciel utilisé pour créér les pages (surtout si vous faites des ‘copier/coller’
  • vérifiez si possible qu’aucun encodage n’est défini au niveau du serveur (celui-ci outrepasserait vos définitions…)