Win32 API
Funzioni ansi- e caratteri estesi
Ricerca…
introduzione
La documentazione dell'API di Windows per le funzioni che utilizzano una o più stringhe come argomento di solito assomiglierà a questa:
BOOL WINAPI CopyFile(
_In_ LPCTSTR lpExistingFileName,
_In_ LPCTSTR lpNewFileName,
_In_ BOOL bFailIfExists
);
Il tipo di dati per i due parametri di stringa è composto da diverse parti:
- LP = puntatore lungo
- C = const
- T = TCHAR
- STR = stringa
Ora cosa significa TCHAR
? Questo dipende dalla piattaforma scelta per la compilazione del programma.
CopyFile
stesso è solo una macro, definita qualcosa del genere:
#ifdef UNICODE
#define CopyFile CopyFileW
#else
#define CopyFile CopyFileA
#endif
Quindi ci sono in realtà due funzioni CopyFile
e, a seconda dei flag del compilatore, la macro CopyFile
si risolverà in uno o nell'altro.
In questo caso, TCHAR
è definito come:
#ifdef _UNICODE
typedef wchar_t TCHAR;
#else
typedef char TCHAR;
#endif
Quindi, di nuovo, a seconda dei flag di compilazione, TCHAR è un carattere "narrow" o "wide" (2 byte).
Quindi, quando UNICODE è definito, CopyFile
è definito come CopyFileW
, che utilizzerà come array i matrici di caratteri a 2 byte, che dovrebbero essere codificati in UTF-16.
Se UNICODE non è definito, CopyFile
è definito come CopyFileA
che utilizza matrici di caratteri a byte singolo che dovrebbero essere codificate nella codifica ANSI predefinita dell'utente corrente.
Esistono due macro simili: UNICODE
fa in modo che le API di Windows _UNICODE
stringhe estese e _UNICODE
(con un trattino basso di sottolineatura) che abilita funzioni simili nella libreria di runtime C.
Queste definizioni ci permettono di scrivere codice che compila sia in ANSI che in modalità Unicode.
È importante sapere che la codifica ANSI può essere una codifica a byte singolo (ad es. Latin-1) una codifica multi-byte (ovvero shift jis), sebbene utf-8 sia, sfortunatamente, non ben supportato.
Ciò significa che né la variante ANSI, né la variante Wide-character di queste funzioni possono essere assunte per funzionare con codifiche a larghezza fissa.