À la découverte d'Unicode/Programmation/International Components for Unicode

International Components for Unicode (ICU) est un projet open source qui fournit des bibliothèques de traitement utilisables dans les langages informatiques C/C++ et Java, afin de prendre en charge les textes utilisant le répertoire universel de caractères codés (UCS, normalisé dans la norme ISO/CEI 10646 et le standard informatique Unicode), l’internationalisation et la localisation des logiciels. ICU est largement portable vers de nombreux systèmes d’exploitation et environnements. Il donne aux applications les mêmes comportements et résultats sur toutes les plateformes et entre les langages de programmation fournissant une interface avec les langages C, C++ ou Java.

Le projet ICU et licence de distribution et d’utilisation

modifier

Le projet ICU est un projet libre, collaboratif et indépendant des organisations commerciales ; il est destiné à écrire, faire évoluer et distribuer ces bibliothèques dont les codes sources sont disponibles en même temps que des versions précompilées directement utilisables dans d’autres logiciels ; il est activement supporté et utilisé par IBM qui en est l’actuel principal promoteur, et par d’autres entreprises, organisations et individus créant du logiciel.

Ces bibliothèques sont fournies avec une licence ouverte et libre (dérivée de la licence X) et compatible avec les licences libres (de type GPL selon les critères du copyleft de la Free Software Foundation) et les licences ouvertes (selon les critères de l’Open Source Initiative), permettant la réutilisation, la modification, et la redistribution ; cette licence est gratuite mais sans garantie offerte, à la seule condition de fournir une copie de cette licence et de mentionner l’origine (copyright) du logiciel original (dont IBM et les participants au projet ICU sont détenteurs des droits d’auteur sur l’œuvre collective).

Services fournis

modifier

Les principaux services fournis par les bibliothèques ICU sont les suivants :

  • Texte : gestion de texte Unicode, propriétés normatives ou informatives des caractères codés (et de certaines combinaisons de caractères codés), le plus souvent indépendantes de la langue utilisée.
  • Transcodages : conversion du texte entre de nombreux jeux de caractères codés sur un octet ou plusieurs octets d’une part (issus de normes nationales ou internationales ou de standards de l’industrie informatique), et d’autre part le répertoire universel de caractères codés (UCS) défini dans la norme internationale ISO/CEI 10646 et le standard informatique Unicode.
  • Transformations de base normalisées : délimitation des séquences inséparables de caractères codés et normalisations Unicode (NFC, NFD, NFKC, NFKD) ; algorithme NamePrep (pour le support de l‘architecture des noms de domaines Internet internationalisés).
  • Assistance pour l’affichage et la saisie du texte : support de la disposition du texte selon l’ordre visuel des graphèmes, et analyse des variantes graphiques contextuelles requises dans les écritures complexes (arabe, hébreu, devanagari, thaï, etc.).
  • Comparaison : algorithmes rapides de tri alphabétique multi-niveau pour le tri et la recherche de texte, selon la catégorie des caractères, l’écriture ou la casse, et paramétrables selon diverses règles linguistiques ou conventions régionales.
  • Analyse lexicale : délimitation des graphèmes, mots, phrases et lignes ; expressions rationnelles utilisant le jeu Unicode complet et ses propriétés.
  • Transformations lexicales simples : forçage ou normalisation de la casse (capitales, majuscules et minuscules) ou des variantes de présentation de caractères.
  • Transformations lexicales complexes : transcriptions et translittérations selon les langues et conventions nationales ou internationales.
  • Formatage et analyse syntaxique du texte : dates, heures, nombres, monnaies et messages, conformes aux normes internationales ou basés sur des règles de localisation (y compris grammaticales).
  • Temps : calculs et transformations de données temporelles selon de nombreux calendriers et fuseaux horaires.
  • Régionalisation : architecture complète pour les données de localisation et paquets de ressources, support du format d’échange LDML et intégration des données communes de localisation issues du projet CLDR dans ce format.

Origine et développement

modifier

Originellement, ICU a été intégralement écrit en Java. Mais certains travaux initiaux d’ICU viennent du framework pour C++ écrit par l’entreprise Taligent, qui fut rachetée par IBM.

Certaines des fonctionnalités liées à la gestion de texte, au formatage des dates, etc. ont été réécrites en Java pour devenir les API d’internationalisation pour JDK 1.1, qui ont été proposées à Sun Microsystems par l’équipe ICU pour l’intégration à la plateforme de base Java. Une grande portion du code initial en Java existe toujours dans les paquets Modèle:Javadoc:SE et Modèle:Javadoc:SE qui intègrent une version limitée de l’actuelle bibliothèque ICU pour Java.

Ces fonctionnalités furent ensuite portées et étendues en C et en C++ pour surmonter les défauts d’internationalisation de ces langages et de nombreux autres disposant de bibliothèques très incomplètes pour le traitement de l’internationalisation des logiciels et le support correct et complet des algorithmes de traitement du texte basés sur les spécifications du standard Unicode et ses annexes, ainsi que sur les travaux issus d’autres normes internationales dans ces domaines.

D'ordinaire un système d'exploitation fournit ces fonctionnalités, mais le support d’une telle API d’internationalisation n’est pas assuré de façon homogène par tous les systèmes d’exploitation, ni d’une façon suffisante pour prendre en charge un nombre aussi important d’écritures, langues et conventions régionales.

ICU a été livré en 1999 en tant que projet de développement en source ouvert, sous le nom IBM Classes for Unicode. Suite au transfert des droits de propriété intellectuelle d’IBM à une organisation indépendante et à but non lucratif (où d’autres acteurs peuvent participer et prendre part au processus de décision ou d’évaluation des nouvelles fonctionnalités), il fut finalement renommé International Components For Unicode (ICU), et sa licence d’utilisation et de distribution a été libéralisée.

La version Java existe aujourd’hui sous le nom ICU4J, et la version C/C++ existe aujourd'hui sous le nom ICU4C. Les deux bibliothèques disposent de fonctionnalités pratiquement identiques et évoluent selon la même architecture générale en fonction des besoins propres à chaque plateforme (comme la plateforme de base normalisée pour les langages C et C++ ne dispose pas de fonctionnalités suffisantes et est la plus hétérogène, ICU4C les complète pour les amener au même niveau que celles disponibles en Java, qui en a déjà intégré une partie significative et que la version ICU4J n’a pas besoin de remplacer, et les autres différences mineures sont généralement gommées par la mise à niveau de l’un ou l’autre projet lorsque leur développement spécifique est nécessaire).

Le projet ICU et ses deux sous-projets continuent à être développés en parallèle pour le support plus avancé d’Unicode, et de façon plus générale, celui de l’internationalisation (i18n) des logiciels selon l’état de l’art en la matière, et selon l’évolution des normes dont le projet ICU est même devenu un modèle de référence presque incontournable (utilisé aussi dans le développement et le test des évolutions des diverses normes et travaux collaboratifs qu’ICU supporte).

Exemple

modifier

Exemple de code C++ utilisant la bibliothèque ICU, pour le formatage de nombres décimaux sous forme ici de noms correspondant à une suite d’intervalles de valeurs.

#include <unicode/unistr.h>
#include <unicode/ustream.h>
#include <unicode/choicfmt.h>
   
int main(int argc, char *argv[]) {
    // Bornes inférieures des intervalles de valeurs.
    double limits[] = {1, 2, 3, 4, 5, 6, 7};
    // Noms donnés à chaque intervalle.
    UnicodeString weekdayNames[] = {
        "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi", "dimanche"};
    // Crée un format correspondant à la liste de choix bornée par les limites.
    ChoiceFormat fmt(limits, weekdayNames, 7);
    // Déclare une classe destinée à stocker des chaînes de caractères Unicode.
    UnicodeString str;
    for (double x = 1.0; x <= 8.0; x += 1.0) {
        // Formate selon la liste de choix le nombre x dans la chaîne str.
        fmt.format(x, str);
        // Affiche le nombre ainsi que la chaîne formatée.
        cout << x << " -> " << str << endl;
    }
    cout << endl;
    return 0;
}

Liens externes

modifier