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 plates-formes 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 | modifier le code]

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 | modifier le code]

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

Origine et développement

[modifier | modifier le code]

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 (en), 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 plate-forme de base Java. Une grande portion du code initial en Java existe toujours dans les paquets java.text et java.util 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. À la suite du 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 plate-forme (comme la plate-forme 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 | modifier le code]

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 variable 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 | modifier le code]