Aller au contenu

À la découverte d'Unicode/Programmation

Un livre de Wikilivres.

Si ce livre veut s'adresser à un lectorat néophyte, cette section s'adresse plus particulièrement à toutes les personnes qui travaillent dans les métiers liés au développement logiciel.

Bibliothèques logicielles

[modifier | modifier le wikicode]

La bibliothèque logicielle multi plate-forme ICU permet de manipuler des données unicodées.

Elle est en particulier utilisée à partir de LibreOffice 4.0[1].

Dans les langages de programmation

[modifier | modifier le wikicode]

Un support d’Unicode spécifique à certaines plates-formes (non compatible quant au code-source) est également fourni par les systèmes modernes (Java, MFC, GNU/Linux).

Le support d'Unicode dépend du type de données utilisé et des fonctions appelées. Actuellement (2020) un point de code Unicode peut aller de 0 à 1114111 (10FFFF en hexadécimal). La taille du type pour un caractère détermine l'encodage Unicode utilisé :

  • 32 bits : Un caractère suffit pour encoder tous les caractères (encodage UTF-32).
  • 16 bits : Un caractère suffit pour encoder les caractères du plan de base (0x0000-0xFFFF) excluant les codes 0xD800 à 0xDFFF réservés pour encoder les caractères hors du plan de base sur deux codes (encodage UTF-16).
  • 8 bits : Encodage UTF-8.

Les types à utiliser pour stocker des caractères Unicode sur 32 bits, sont les suivants :

Types compatibles avec Unicode dans les langages de programmation
Langage de programmation Un seul caractère ou une partie de caractère Chaîne de caractères
Type Exemple de valeur Type Exemple de valeur
C char[4][alpha 1] ou wchar_t[2][alpha 2] ou char16_t[2] ou char32_t u8'œ' ou L'œ' ou u'œ' ou U'œ' char[] ou wchar_t[] ou char16_t[] ou char32_t[] u8"œ€" ou L"œ€" ou u"œ€" ou U"œ€"
C++ char[4][alpha 1] ou wchar_t[2][alpha 2] ou char16_t[2] ou char32_t u8'œ' ou L'œ' ou u'œ' ou U'œ' char[] ou wchar_t[] ou char16_t ou char32_t ou std::string ou std::wstring u8"œ€" ou L"œ€" ou u"œ€" ou U"œ€"
Java char[2] ou int[alpha 3] 'œ' char[] ou String "œ€"
Bibliothèque ICU (pour C/C++ ou Java) UChar UChar[] ou String, UnicodeString
JavaScript ou ECMAScript char[alpha 4] string "œ€"
C# ou J# char 'œ' string "œ€"
Delphi char[4][alpha 1] ou widechar[2] string[alpha 1] ou widestring
Python 2 unicode u"œ€"
Python 3 str "œ€"
Vala uint8[alpha 5] ou char[alpha 6] ou unichar[alpha 7] string[2]

Notes du tableau alpha

  1. 1,0 1,1 1,2 et 1,3 En UTF-8
  2. 2,0 et 2,1 On notera toutefois que le type wchar_t du langage C ne permet pas toujours de coder tous les caractères Unicode, car la norme de ce langage ne prévoit pas de nombre minimum suffisante pour ce type standard. Cependant de nombreux compilateurs du langage définissent wchar_t sur 32 bits (voire 64 bits sur les environnements manipulant les entiers standards sur 64 bits), ce qui suffit pour stocker n’importe quel point de code Unicode normalisé. Mais d’autres compilateurs représentent wchar_t sur 16 bits (notamment sous Windows en environnement 16 ou 32 bits), voire sur 8 bits seulement (notamment dans les environnements embarqués ne disposant pas d’un système d’exploitation d’usage général) car wchar_t peut utiliser la même représentation que le type char qui compte un minimum de 8 bits.
  3. De manière similaire au C et au C++, le langage Java dispose de type unitaire permettant de coder 16 bits, mais ne permettant pas de coder un seul point de code d’une valeur quelconque (le type natif char est un entier positif sur 16 bits seulement). Pour manipuler les caractères normalisés hors du premier plan, il faut utiliser une paire de codets, chacun contenant une valeur égale aux deux codets définis par la forme UTF-16. Aussi les types d’objets String ou char[2] sont les plus appropriés pour représenter un caractère Unicode. Depuis Java 1.4.1, la bibliothèque standard fournit un support complet d’Unicode grâce au type natif int (qui est un entier défini sur 32 bits) et aux méthodes statiques de la classe standard Character (cependant un objet instancié de ce type Character ne permet pas, tout comme le type natif char, de stocker n’importe quel point de code).
  4. JavaScript comporte diverses implémentations non normalisées dont certaines plus anciennes ne supportent pas plus de 16 bits par caractère, et parfois seulement 8 bits. Toutefois la norme ECMAScript de ce langage définit une classe utilitaire Character sur 32 bits (en fait basée sur la classe Number) devant supporter tous les points de code des 17 plans normalisés, tandis que les chaines de caractères utilise des caractères codés obligatoirement sur 16 bits (mais sans restriction renforçant l’appariement des unités de code UTF-16, les chaînes ECMAScript de type String n’étant pas restreintes au seul codage UTF-16 mais étant des vecteurs de constantes entières codées sur 16 bits sans restriction, afin d’assurer l’interopérabilité avec Java et d’autres langages qui eux non plus ne renforcent pas les restrictions de conformité UTF-16 dans leurs types natifs de données). Ces deux langages ne supportent pas de typage explicite des variables, le type étant défini dynamiquement par les valeurs qu’on leur assigne (aussi, plusieurs représentations internes sont possibles, leurs différences étant normalement transparentes pour le programmeur).
  5. un octet
  6. non spécifié
  7. un caractère complet

Autres bibliothèques

[modifier | modifier le wikicode]

La bibliothèque Qt permet aussi de gérer Unicode[3].

Le cas de Linux

[modifier | modifier le wikicode]

Dans le cas de Linux, le développement en langage C peut se faire avec des interfaces spécifiques, en 2001[4].

Expressions rationnelles

[modifier | modifier le wikicode]

Unicode souffre toutefois encore d’un faible support des expressions rationnelles par certains logiciels, même si des bibliothèques comme ICU et Java peuvent les supporter. Un tel support n’a pas encore été standardisé pour ECMAScript et n’est fourni qu’avec l’aide de bibliothèques créées avec le langage ou des interfaces d’interopérabilité avec d’autres systèmes (notamment avec CORBA, COM) ou langages (notamment C++ et Java).

  1. https://fr.libreoffice.org/telecharger/nouveautes-et-correctifs-de-la-version-4-0/
  2. valadoc.org/#!api=glib-2.0/string
  3. http://doc.qt.digia.com/qt/unicode.html
  4. http://www.ibm.com/developerworks/library/l-linuni/index.html Linux Unicode programming How to incorporate and utilize Unicode for foreign language support