Comprendre les appels de caractères

Cet article est la traduction de l’article de Lachlan Hunt, Character References Explained.

Merci aux traducteurs du W3C à qui j'ai emprunté bon nombre de traductions de termes techniques et qui ont fait que certaines références de cet article sont aussi disponibles en français.

Il semblerait que de nombreuses personnes ne sont pas aussi bien informées qu’elles devraient l’être à propos des appels de caractères. Je vais donc vous expliquer clairement tout ce que vous devez savoir sur le sujet (et certaines choses dont vous n’avez pas besoin), principalement pour le HTML et le XML. Il y a deux types d’appels de caractères : les appels numériques de caractères et les appels d’entités de caractères.

Les appels numériques de caractères

Il y a deux formes d’appels numériques de caractères : la forme décimale et la forme hexadécimale.

La syntaxe

Les appels décimaux prennent la forme &#nnnn;, où nnnn est la référence au point de code Unicode du caractère en décimal [0-9]. Les appels hexadécimaux prennent la forme &#xhhhh; où hhhh est le point de code en notation hexadécimale [0-9a-fA-F].

Pour les appels de caractères en HTML, le x est insensible à la casse, mais en XML il doit être en minuscule. Donc   par exemple est valide en HTML mais invalide en XML.

En HTML, une fin de référence est soit :

  • Un délimiteur (par défaut un point-virgule) de fermeture de référence (reference close, REFC)
  • Un code de fonction de fin d’enregistrement (record end, RE)
  • Un caractère, comme un espace, ne se retrouvant dans aucun nom d’entité.

Cela signifie simplement que le point-virgule final peut être omis dans certaines circonstances. Cependant il peut être difficile de se souvenir précisément de quand il peut ou ne peut pas être omis, et pour limiter au maximum les risques d’erreur, il est préférable de toujours l’inclure. En XML, le point-virgule est obligatoire. Ces règles s’appliquent également aux appels d’entités de caractères.

Le répertoire de caractères

Il est particulièrement important de noter que quelque soit le codage de caractères du document, les appels numériques de caractères font toujours référence à la position de code dans le répertoire Unicode. En termes SGML, cela s’appelle le jeu de caractères du document (Document Character Set ou DCS) et est défini pour HTML dans la déclaration SGML. En HTML et XML, le DCS est défini comme étant ISO-10646 (ou Unicode). Notez bien qu’il y a une différence entre le DCS et le codage de caractères du fichier, qui peut être n’importe quoi, y compris ISO-8859-1, UTF-8, UTF-16, Shift_JIS, ou tout autre codage ; mais le codage n’affecte en rien les appels numériques de caractères, ils font toujours référence à un caractère faisant partie du DCS, qui est défini comme étant Unicode.

Par exemple, si vous voulez inclure l’apostrophe typographiquement correcte (’) avec un appel numérique, vous devez connaître son point de code Unicode. En l’occurrence il s’agit de U+2019 ou, en décimal, 8217. Les appels de caractères en hexadécimal et en décimal seront donc respectivement ’ et ’.

Quelques erreurs courantes

Une erreur très répandue est l’utilisation de points de code issus du répertoire Windows-1252. Sachez que c’est incorrect, même si les navigateurs ont été obligés de les supporter simplement parce qu’Internet Explorer les supporte. Les points de code problématiques s’étendent de 128 à 159. Dans Windows-1252, l’apostrophe typographique se retrouve dans cette étendue à la position 0x92, ou, plus communément, en décimal, 146. Toutefois vous ne pouvez pas inclure ce caractère avec ce point de code, soit ’ soit ’, parce que cela reviendrait à se référer au point de code Unicode et non à Windows-1252 et que les points de code de cette étendue sont définis comme étant des codes de commande.

Ces codes de commande sont définis comme UNUSED (inutilisé) dans La déclaration SGML de HTML 4 (traduction française). Dans le vocable impénétrable des termes SGML, cela en fait des caractères non-SGML. D’après la section 13.1.1 du guide de SGML, cela signifie simplement qu’aucun sens n’est attribué à ce caractère, mais ce même guide dit clairement dans la section 9.2 qu’un caractère non-SGML peut être saisi en tant que caractère de donnée dans une entité SGML en utilisant une référence de caractère.

Problèmes de validation

Pour être très précis, bien que ces caractères ne peuvent être inclus en tant que caractères de données dans un document HTML, il n’est pas invalide d’y faire référence avec des appels de caractères. Le problème vient d’une combinaison du fait que le sens d’un caractère non-SGML est particulièrement obscur et que, dans Unicode, ces caractères sont des codes de commande non imprimables.

Pour cette raison, le validateur affiche seulement un avertissement ; mais bien que cette utilisation reste techniquement valide, elle devrait être traitée comme une erreur car il est pratiquement certain que ces caractères n’ont pas le sens désiré par l’auteur — en fait, leur sens est indéfini. Pour clarifier un peu plus les problèmes de validation, comparez les résultats de l’utilisation d’un caractère non-SGML écrit directement dans le balisage avec les résultats de l’utilisation d’une référence à un caractère non-SGML. Le premier exemple échouera à cause d’une erreur de validation, alors que le second passera la validation mais avec un avertissement, alors qu’ils utilisent en fait le même caractère.

Sachez qu’il n’en va pas de même pour le XML (ainsi que le XHTML). Techniquement, cette étendue de caractères (de 128 à 159) est parfaitement valide conformément à production de caractères dans XML (traduction française), mais ils se réfèrent bien à des codes de commande Unicode, leur signification est indéfinie dans le contexte du document et ils ne devraient donc pas être utilisés. Bien que le validateur du W3C renvoie les mêmes erreur et avertissement pour les documents XHTML équivalents, ce n’est qu’un symptôme de ses origines de validateur SGML adapté pour fonctionner dans un « mode Â» XML. Toutefois la validation à l’aide d’un véritable validateur XML (comme celui de Page Valet) ne renverra aucune erreur ou avertissement.

Il est important de prendre conscience que, pour XML, utiliser ou faire référence à un caractère qui ne correspond pas à la production de caractères enfreint la contrainte de forme. Par exemple, l’utilisation d’un code de commande compris entre 0 et 31 (à l’exception de la tabulation, du retour de chariot et du retour à la ligne) que ce soit directement ou avec une référence numérique de caractère constitue une erreur de forme.

Les appels d’entités de caractères

Les appels d’entités de caractères utilisent des noms symboliques à la place des numéros et prennent la forme &name;. Tous les appels d’entités sont sensibles à la casse. Donc par exemple å et Å font référence à deux caractères distincts en HTML soit, respectivement, Ã¥ et Ã…. Les règles pour la fin de référence sont les mêmes que pour les appels numériques de caractères (décrits plus haut).

Parmi les entités les plus connues de HTML on trouve &, <, > et ". Curieusement, " a effectivement été retiré de HTML 3.2, mais cette erreur a été reconnue et " a été réintégré dans HTML 4.

Les appels d’entités prédéfinis pour XML

En XML, ce sont quatre des cinq appels d’entités prédéfinis qui peuvent être utilisés dans tout document XML, sans avoir recours une définition dans la DTD. La cinquième entité prédéfinie dans XML est ', mais la raison pour laquelle je la mentionne séparément est qu’elle n’est pas définie dans HTML et en conséquence elle n’est pas supportée non plus par Internet Explorer pour le HTML. Cependant on a rarement besoin d’y faire appel, puisque elle est nécessaire seulement à l’intérieur d’un attribut délimité par des guillemets droits simples (') au lieu des guillemets droits doubles conventionnels ("). Dans ces cas, il est toujours possible d’utiliser un appel numérique de caractère à la place.

Les appels d’entités externes

HTML 4, XHTML 1.x et MathML définissent de nombreux autres appels d’entités de caractères dans leurs DTD respectives. Ce sont les appels d’entités externes. En HTML ils sont divisés en trois groupes : les caractères ISO-8859-1, les symboles, symboles mathématiques et les lettres grecques et les caractères significatifs pour le balisage et les caractères pour l’internationalisation. Digital Media Minute a publié un tableau des appels d’entités de caractères pratique qui reprend tous ces caractères. Si vous vous intéressez aux entités MathML, consultez le chapitre 6 de MathML 2.0 (traduction française).

Parce qu’elles sont définies dans une DTD, techniquement aucune ne peut être utilisée dans un document HTML en l’absence d’une déclaration de DOCTYPE appropriée référençant une DTD HTML appropriée ; bien que comme les navigateurs ne lisent pas les DTD de toute façon, ceux-ci les supporteront quand même. Cependant en XHTML et MathML (servi avec un type MIME XML), le DOCTYPE est requis pour des raisons pratiques afin d’utiliser toute entité autre que les 5 entités prédéfinies.

Par exemple   et ’ sont définis dans la DTD de XHTML, ils ne sont pas prédéfinis en XML et nécessitent donc l’utilisation de la DTD. Sans elle, leur utilisation viole la contrainte de forme, mais remarquez qu’utiliser des entités externes n’est pas sûr en XML parce que cela nécessite un processeur XML validant afin de lire la DTD. La FAQ des auteurs Web de Mozilla précise :

Dans les anciennes versions de Mozilla comme dans les anciens produits basés sur Mozilla, il n’y a pas de catalogue de pseudo-DTD et l’utilisation d’entités externes (outre les cinq prédéfinies) génère une erreur d’analyse XML. Il existe aussi d’autres agents utilisateur qui ne supportent pas les entités externes (outre les cinq prédéfinies). Puisque les processeurs XML validants ne sont pas obligés de supporter les entités externes (outre les cinq prédéfinies), l’utilisation d’entités externes (outre les cinq prédéfinies) est intrinsèquement peu fiable dans les documents XML destinés au web. La meilleure pratique consiste à utiliser directement de l’UTF-8 au lieu des entités. (Les appels numériques de caractères sont également fiables).

L’alternative est d’utiliser uniquement des appels numériques de caractères au lieu des entités externes, mais la meilleure solution reste d’utiliser un codage Unicode, comme UTF-8 ou UTF-16, et de saisir le caractère réel (consultez mon Guide de l’Unicode pour plus d’informations). Si vous utilisez un codage Unicode il est probable que les seules occasions où il est utile de recourir aux appels de caractères au lieu des caractères réels est pour les caractères non imprimables, comme l’espace insécable (  ou, de préférence,  ), Em-space, En-space, les caractères à chasse nulle, etc. La raison principale est de pouvoir les identifier clairement lors de la lecture ou de l’écriture du code source.

Résumé

Les appels numériques de caractères, à la fois décimaux et hexadécimaux, peuvent être utilisés sans risque en (X)HTML et XML, mais prenez garde à bien référencer le point de code du caractère dans le répertoire Unicode, et non dans celui de Windows-1252 (particulièrement pour l’étendue de 128 à 159).

Les appels d’entités de caractères peuvent être utilisés en HTML et en XML ; mais pour XML, outre les cinq entités prédéfinies, ils doivent être définis dans une DTD (comme pour XHTML et MathML). Les cinq entités prédéfinies en XML sont : &, <, >, " and '. Parmi celles-ci, souvenez-vous que ' n’est pas définie dans HTML. L’utilisation d’autres entités en XML nécessite un processeur validant, ce qui rend leur utilisation sur le web particulièrement peu fiable. Il est recommandé de s’en tenir aux cinq entités prédéfinies et aux appels numériques de caractères, ou d’utiliser un codage Unicode.

← article précédentarticle suivant →

Les commentaires pour cet article sont fermés.