Recherche…


introduction

La documentation de l'API Windows pour les fonctions prenant une ou plusieurs chaînes en argument ressemblera généralement à ceci:

BOOL WINAPI CopyFile(
  _In_ LPCTSTR lpExistingFileName,
  _In_ LPCTSTR lpNewFileName,
  _In_ BOOL    bFailIfExists
);

Le type de données pour les deux paramètres de chaîne est composé de plusieurs parties:

  • LP = Pointeur long
  • C = const
  • T = TCHAR
  • STR = chaîne

TCHAR signifie TCHAR ? Cela dépend de la plate-forme choisie pour la compilation du programme.

CopyFile n'est qu'une macro, définie comme suit:

#ifdef UNICODE
#define CopyFile CopyFileW
#else
#define CopyFile CopyFileA
#endif

Il existe donc deux fonctions CopyFile et, en fonction des indicateurs du compilateur, la macro CopyFile sera résolue en l’une ou l’autre.

TCHAR est défini comme suit:

#ifdef _UNICODE
typedef wchar_t TCHAR;
#else
typedef char TCHAR;
#endif

Donc, encore une fois, en fonction des indicateurs de compilation, TCHAR est un caractère "étroit" ou "large" (2 octets).

Ainsi, lorsque UNICODE est défini, CopyFile est défini comme étant CopyFileW , qui utilisera comme paramètre des tableaux de caractères à 2 octets, qui devraient être codés en UTF-16.

Si UNICODE n'est pas défini, CopyFile est défini comme étant CopyFileA qui utilise des tableaux de caractères codés sur un octet et qui sont censés être encodés dans le codage ANSI par défaut de l'utilisateur actuel.

Il existe deux macros similaires: UNICODE fait en UNICODE que les API Windows attendent des chaînes _UNICODE et _UNICODE (avec un trait de soulignement principal) qui active des fonctionnalités similaires dans la bibliothèque d'exécution C.

Ces définitions nous permettent d'écrire du code qui compile à la fois en mode ANSI et en mode Unicode.

Il est important de savoir que le codage ANSI peut être un codage à un octet (latin-1), un codage à plusieurs octets (c.-à-d. Shift jis), bien que, malheureusement, utf-8 ne soit pas bien pris en charge.

Cela signifie que ni la variante ANSI, ni la variante caractère large de ces fonctions ne peuvent être supposées fonctionner avec des codages à largeur fixe.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow