Partager via


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*

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 se résout en la version Unicode lorsque le symbole de préprocesseur UNICODE est défini ou en la version ANSI sinon.

#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.

Next

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