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.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow