Condividi tramite


Uso delle stringhe

Windows supporta in modo nativo stringhe Unicode per elementi dell'interfaccia utente, nomi di file e così via. Unicode è la codifica dei caratteri preferita, perché supporta tutti i set di caratteri e le lingue. Windows rappresenta i caratteri Unicode usando la codifica UTF-16, in cui ogni carattere viene codificato come uno o due valori a 16 bit. I caratteri UTF-16 sono denominati caratteri wide , per distinguerli dai caratteri ANSI a 8 bit. Il compilatore Visual C++ supporta il tipo di dati predefinito wchar_t per i caratteri wide. Il file di intestazione WinNT.h definisce anche il typedef seguente.

typedef wchar_t WCHAR;

Entrambe le versioni verranno visualizzate nel codice di esempio MSDN. Per dichiarare un valore letterale di caratteri wide o un valore letterale stringa di caratteri wide, inserire L prima del valore letterale.

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

Ecco alcuni altri typedef correlati alla stringa che verranno visualizzati:

Typedef Definizione
CHAR char
PSTR o LPSTR char*
PCSTR o LPCSTR const char*
PWSTR o LPWSTR wchar_t*
PCWSTR o LPCWSTR const wchar_t*

 

Funzioni Unicode e ANSI

Quando Microsoft ha introdotto il supporto Unicode per Windows, ha facilitato la transizione fornendo due set paralleli di API, uno per le stringhe ANSI e l'altro per le stringhe Unicode. Esistono ad esempio due funzioni per impostare il testo della barra del titolo di una finestra:

  • SetWindowTextA accetta una stringa ANSI.
  • SetWindowTextW accetta una stringa Unicode.

Internamente, la versione ANSI converte la stringa in Unicode. Le intestazioni di Windows definiscono anche una macro che si risolve nella versione Unicode quando il simbolo UNICODE del preprocessore è definito o la versione ANSI in caso contrario.

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

In MSDN, la funzione è documentata con il nome SetWindowText, anche se è effettivamente il nome della macro, non il nome effettivo della funzione.

Le nuove applicazioni devono sempre chiamare le versioni Unicode. Molte lingue mondiali richiedono Unicode. Se si usano stringhe ANSI, sarà impossibile localizzare l'applicazione. Le versioni ANSI sono anche meno efficienti, perché il sistema operativo deve convertire le stringhe ANSI in Unicode in fase di esecuzione. A seconda delle preferenze, è possibile chiamare in modo esplicito le funzioni Unicode, ad esempio SetWindowTextW o usare le macro. Il codice di esempio in MSDN chiama in genere le macro, ma i due moduli sono esattamente equivalenti. La maggior parte delle API più recenti in Windows ha solo una versione Unicode, senza una versione ANSI corrispondente.

TCHAR

Quando le applicazioni dovevano supportare sia Windows NT che Windows 95, Windows 98 e Windows Me, era utile compilare lo stesso codice per stringhe ANSI o Unicode, a seconda della piattaforma di destinazione. A questo scopo, Windows SDK fornisce macro che eseguono il mapping delle stringhe a Unicode o ANSI, a seconda della piattaforma.

Macro Unicode ANSI
TCHAR wchar_t char
TEXT("x") o _T("x") L"x" "x"

 

Ad esempio, il seguente codice:

SetWindowText(TEXT("My Application"));

viene risolto in uno dei modi seguenti:

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

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

Le macro TEXT e TCHAR sono meno utili oggi, perché tutte le applicazioni devono usare Unicode. Tuttavia, è possibile che vengano visualizzati nel codice precedente e in alcuni esempi di codice MSDN.

Le intestazioni per le librerie di runtime di Microsoft C definiscono un set simile di macro. Ad esempio, _tcslen viene risolto in strlen se _UNICODE non è definito; in caso contrario, viene risolto in wcslen, ovvero la versione a caratteri wide di strlen.

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

Prestare attenzione: alcune intestazioni usano il simbolo UNICODEdel preprocessore , altre usano _UNICODE con un prefisso di sottolineatura. Definire sempre entrambi i simboli. Visual C++ le imposta entrambe per impostazione predefinita quando si crea un nuovo progetto.

Prossima

Che cos'è una finestra?