2004-09-30

Java et compatibilité descendante

La norme Unicode, c'est super pour s'échanger du texte sous forme numérique. Elle permet à tout le monde de se mettre d'accord vis-à-vis de l'attribution d'un nombre à un caractère :

  • A est représenté en interne par le nombre 41 (hexadécimal)
  • ¾ est représenté par le nombre 178 (hexadécimal)
  • ¤ est représenté par 20ac (hexadécimal)
  • etc.

À l'heure actuelle, le nombre limite est 10ffff, ce qui fait un million (1 114 112) de possibilités.

À l'époque où a été inventé Java, le consortium Unicode n'avait pas encore atteint autant de caractères possibles. C'est pourquoi dans Java, il fut décidé que les chaines de caractères seraient codées à l'aide d'une suite de nombres sur 16 bits (65 536 possibilités). C'était un choix tout à fait sensé à l'époque.

Maintenant qu'on a dépassé les 65 536 possibilités, ça devient plus génant.

Depuis peu, la volonté est née chez les papas de Java de pouvoir gérer la totalité des caractères Unicode. C'est une bonne idée de leur part. Le tout est très bien expliqué dans cet article sur les caractères supplémentaires dans Java.

J'ai trouvé l'article intéressant, car il parle d'un problème sur lequel je me suis penché à plusieurs reprises (l'encodage des caractères), mais il parle aussi d'un problème fréquemment rencontré dans le domaine logiciel : comment améliorer un produit sans faire exploser la base existante.

Aujourd'hui, si je devais choisir un encodage pour une nouvelle plateforme informatique, ça serait un encodage à 32 bits par caractère (24 bits feraient économiser de la mémoire mais impliqueraient des traitements plus lourds). Pour Java, bien qu'envisagé, ce choix n'était pas compatible... avec la compatibilité descendante ! Les concepteurs ont donc décidé d'utiliser de l'encodage UTF-16 (en résumé), qui a l'irritant inconvénient de stocker des caractères de taille variable. Avoir une suite de dix nombres de 16 bits ne signifie plus forcément que cette suite représente dix caractères, elle peut en représenter moins.

Merci à la table Unicode de Vincent ; si vous ne voyez pas correctement les caractères ce cette table, installez une police qui possède la plupart des dessins de caractères (on utilise le terme « glyph »), comme l'Arial Unicode MS.