Partager via


Utilisation des chaînes

Windows prend en charge en mode natif 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 tous les langages. Windows représente des caractères Unicode à l’aide de l’encodage UTF-16, dans lequel chaque caractère est encodé sous la forme d’une ou deux valeurs 16 bits. Les caractères UTF-16 sont appelés caractères larges , pour les distinguer des caractères ANSI 8 bits. 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;

Vous verrez les deux versions dans l’exemple de code MSDN. Pour déclarer un littéral à caractères larges ou un littéral de chaîne à caractères larges, placez L avant le littéral.

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

Voici d’autres typedefs liés aux chaînes que vous verrez :

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, il 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 version Unicode lorsque le symbole UNICODE de préprocesseur est défini ou la version ANSI dans le cas contraire.

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

Dans MSDN, la fonction est documentée sous le nom SetWindowText, même s’il s’agit en fait du nom de la macro, et non du nom réel de la fonction.

Les nouvelles applications doivent toujours appeler les versions Unicode. De nombreuses langues mondiales 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 au moment de l’exécution. Selon vos préférences, vous pouvez appeler les fonctions Unicode explicitement, telles que SetWindowTextW, ou utiliser les macros. L’exemple de code sur MSDN appelle généralement les macros, mais les deux formes sont exactement équivalentes. La plupart des API les plus récentes de Windows n’ont qu’une version Unicode, sans version ANSI correspondante.

TCHAR

Lorsque les applications devaient prendre en charge à la fois Windows NT et Windows 95, Windows 98 et Windows Me, il était utile de compiler le même code pour les chaînes ANSI ou Unicode, en fonction de la plateforme cible. À cette fin, le Kit de développement logiciel (SDK) Windows fournit des macros qui mappent des chaînes à Unicode ou 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"));

résout l’une des valeurs suivantes :

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

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

Les macros TEXT et TCHAR sont aujourd’hui moins utiles, car toutes les applications doivent utiliser Unicode. Toutefois, vous pouvez les voir dans un code plus ancien et dans certains exemples de code MSDN.

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

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

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

Suivant

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