À la découverte d'Unicode/Programmation
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
modifierICU
modifierLa 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
modifierUn 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 :
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,0 1,1 1,2 et 1,3 En UTF-8
- ↑ 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éfinissentwchar_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ésententwchar_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) carwchar_t
peut utiliser la même représentation que le typechar
qui compte un minimum de 8 bits. - ↑ 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’objetsString
ouchar[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 natifint
(qui est un entier défini sur 32 bits) et aux méthodes statiques de la classe standardCharacter
(cependant un objet instancié de ce typeCharacter
ne permet pas, tout comme le type natifchar
, de stocker n’importe quel point de code). - ↑ 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 classeNumber
) 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 typeString
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). - ↑ un octet
- ↑ non spécifié
- ↑ un caractère complet
Autres bibliothèques
modifierLa bibliothèque Qt permet aussi de gérer Unicode[3].
Le cas de Linux
modifierDans le cas de Linux, le développement en langage C peut se faire avec des interfaces spécifiques, en 2001[4].
Expressions rationnelles
modifierUnicode 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).
Notes
modifier- ↑ https://fr.libreoffice.org/telecharger/nouveautes-et-correctifs-de-la-version-4-0/
- ↑ valadoc.org/#!api=glib-2.0/string
- ↑ http://doc.qt.digia.com/qt/unicode.html
- ↑ http://www.ibm.com/developerworks/library/l-linuni/index.html Linux Unicode programming How to incorporate and utilize Unicode for foreign language support