Utilisation des chaînes

Cette rubrique explique comment Windows prend en charge les chaînes Unicode pour les éléments d’interface utilisateur, les noms de fichiers, etc. (Unicode est l’encodage de caractères préféré car il prend en charge tous les jeux de caractères et langues).

Windows représente les caractères Unicode en utilisant l’encodage UTF-16, dans lequel chaque caractère est encodé sous forme d’une ou deux valeurs de 16 bits. Pour les distinguer des caractères ANSI de 8 bits, les caractères UTF-16 sont appelés caractères larges. Le compilateur Visual C++ prend en charge le type de données intégré wchar_t pour les caractères larges. Le fichier d’en-tête WinNT.h définit également le typedef suivant.

typedef wchar_t WCHAR;

Pour déclarer un littéral de caractère large ou un littéral de chaîne de caractères larges, mettez L avant le littéral.

wchar_t a = L'a';
wchar_t *str = L"hello";

Le tableau suivant liste quelques autres typedefs liés aux chaînes de caractères :

typedef Définition
CHAR char
PSTR ou LPSTR char*
PCSTR ou LPCSTR const char*
PWSTR ou LPWSTR wchar_t*
PCWSTR ou LPCWSTR const wchar_t*

Important

Les types WCHAR et wchar_t sont généralement décrits comme représentant des caractères Unicode. Toutefois, il est plus précis de dire qu’ils représentent des unités de code UTF-16 Unicode. La norme Unicode® utilise le terme caractère pour faire référence aux éléments de texte abstraits encodés par la norme et l’unité de code pour faire référence aux valeurs typées utilisées pour les représenter dans un formulaire d’encodage Unicode. Dans l’encodage UTF-16, les caractères Unicode sont encodés sous la forme d’une ou deux unités de code 16 bits. Dans Windows, WCHAR et wchar_t sont toujours une seule unité de code 16 bits. Bien que de nombreux caractères Unicode soient représentés à l’aide d’une seule valeur WCHAR ou wchar_t, de nombreux autres caractères Unicode nécessitent une séquence de deux valeurs de ce type. Ces paires d’unités de code UTF-16 sont souvent appelées paires de substitution, et chacune des valeurs 16 bits d’une paire de substitution est appelée unité de code de substitution. Lorsque vous utilisez des chaînes Unicode, il est important de ne jamais traiter une seule unité de code de substitution comme caractère complet. Pour plus d’informations, consultez substituts et caractères supplémentaires .

Fonctions Unicode et ANSI

Lorsque Microsoft a introduit la prise en charge d’Unicode dans Windows, cela a facilité la transition en fournissant deux ensembles parallèles d’API, l’un pour les chaînes ANSI et l’autre pour les chaînes Unicode. Par exemple, il existe deux fonctions pour définir le texte de la barre de titre d’une fenêtre :

  • SetWindowTextA prend une chaîne ANSI.
  • SetWindowTextW prend une chaîne Unicode.

En interne, la version ANSI traduit la chaîne en Unicode. Les en-têtes Windows définissent également une macro qui correspond à la version Unicode lorsque le symbole du préprocesseur UNICODE est défini, et à la version ANSI dans le cas contraire.

#ifdef UNICODE
#define SetWindowText  SetWindowTextW
#else
#define SetWindowText  SetWindowTextA
#endif 

La fonction est documentée sous le nom SetWindowText, même si c’est vraiment le nom de la macro, pas le nom de la fonction réelle.

Les nouvelles applications doivent toujours appeler les versions Unicode. De nombreuses langues du monde nécessitent Unicode. Si vous utilisez des chaînes ANSI, il sera impossible de localiser votre application. Les versions ANSI sont également moins efficaces, car le système d’exploitation doit convertir les chaînes ANSI en Unicode à l’exécution. Selon votre préférence, vous pouvez appeler explicitement les fonctions Unicode, telles que SetWindowTextW, ou utiliser les macros. La plupart des API Windows récentes ont généralement une version Unicode uniquement.

TCHARs

Dans certains cas, il peut être utile de compiler le même code pour des chaînes ANSI ou Unicode, selon la plateforme cible. À cette fin, le SDK Windows fournit des macros qui mappent les chaînes en Unicode ou en ANSI, selon la plateforme.

Macro Unicode ANSI
TCHAR wchar_t char
TEXT("x") ou _T("x") L"x" "x"

Par exemple, le code suivant :

SetWindowText(TEXT("My Application"));

se résout en l’un des éléments suivants :

SetWindowTextW(L"My Application"); // Unicode function with wide-character string.

SetWindowTextA("My Application");  // ANSI function.

Les macros TEXT et TCHAR sont moins utiles aujourd’hui, car toutes les applications doivent utiliser Unicode.

Les en-têtes des bibliothèques d’exécution C de Microsoft définissent un ensemble similaire de macros. Par exemple, _tcslen se résout en strlen si _UNICODE est indéfini ; sinon, il se résout en wcslen, qui est la version à caractère large de strlen.

#ifdef _UNICODE
#define _tcslen     wcslen
#else
#define _tcslen     strlen
#endif 

Faites attention : certains en-têtes utilisent le symbole de préprocesseur UNICODE, d’autres utilisent _UNICODE avec un préfixe de soulignement. Définissez toujours les deux symboles. Visual C++ les définit par défaut lorsque vous créez un nouveau projet.

Suivant

Qu’est-ce qu’une fenêtre ?