2003-12-25

Mozilla bug 218277 contre-attaque

J'ai trouvé la solution au bug de Mozilla que j'avais soumis il y a dix jour. J'ai compilé une version perso de Mozilla sans ce bug et ça fonctionne comme un charme. Cependant me voilà confronté au même genre de problème que celui concernant les espaces insécables : le comportement que je dénonce comme étant un bug a été la volonté un jour d'un des programmeurs de Mozilla :p

Quelques explications s'imposent. Les caractères d'un document (x)html sont représentés par un format précis basé sur une table de caractères, ou « charset » en anglais. Une table de caractères permet de faire la correspondance entre un nombre (une suite de 0 et de 1 dans le document) et un caractère. Par exemple, ce site utilise la table de caractère iso-8859-15. Ainsi la lettre « a » sera représenté par les huit bits suivants : 01100001, soit un octet dont la valeur est 97.

Il peut cependant se poser le problème suivant : comment faire pour représenter dans son document un caractère qui ne se trouve pas dans la table de caractères que l'on a choisie ? Pour cela on a recours à une notation spéciale consistant à effectuer une référence vers la table ultime mondiale de tous les caractères connus, j'ai nommé Unicode.

Voici par exemple la lettre grecque epsilon minuscule : ε. Cette lettre ne se trouve pas dans l'iso-8859-15, par conséquent j'ai utilisé la notation spéciale pour la représenter ici. Cette notation je l'ai écrite : ε. 949 est le nombre qui représente le epsilon en Unicode, et ce nombre est entouré par les caractères « &# » et « ; ». On appelle ça une « référence numérique sur caractère », ou « numeric character references » en anglais. Il faut prendre garde à ne pas oublier le point-virgule. Il arrive que des sites utilisant ce principe s'affichent mal par oubli de ce point-virgule :p

N'abandonnez pas la lecture, vous allez bientôt tout comprendre du bug en question :)

Quand une page (x)html a un formulaire avec un champs texte, et que ce formulaire est envoyé, les caractères sont codés en fonction de la table de caractères spécifiée par la page. Des caractères présents dans la table du document sont codés normalement, les autres utilisent des références numériques.

L'iso-8859-1 est une des tables de caractères les plus utilisées sur l'Internet. Cette table est parfois appelée « latin1 », et permet de coder la plupart des langues occidentales. Mozilla a une faille quand il utilise cette table de caractères dans un document avec un formulaire : des caractères non présents ne se retrouvent pas toujours transformés en références numériques ! De quoi obtenir de bonnes incohérences dans les programmes qui traitent les données reçues.

En fait à l'heure actuelle Mozilla fait la confusion entre l'iso-8859-1 et une autre table de caractères nommée windows-1252. Cette dernière est la table utilisée par Windows pour coder les langues occidentales. Ces deux tables se ressemblent beaucoup, et j'imagine que de là provient la confusion dans le code source de Mozilla... Ou alors le programmeur qui s'est occupé de cette partie avait un peu trop fait la fête la veille. Enfin voilà, c'est le bug 218277.

Vous avez noté que ce site utilise l'iso-8859-15 (aussi appelé « latin9 » ou « latin0 ») car cette table de caractères comble des oublis du latin1 (le symbole euro, des ligatures, etc.). De plus, les pages codées en latin9 ne souffrent pas du bug 218277. Ok, vous me direz que je n'ai pas de formulaires sur mon site, mais si votre site en a, je vous conseille de réfléchir à tout cela :)

J'ai bien sûr soumis un patch dans bugzilla. J'espère que cette correction sera acceptée (du fait que je casse un méchanisme existant) ou que ce bug ne restera pas dans l'oubli comme c'est le cas de nombreux autres bugs dans Mozilla.