Condividi tramite


Uso delle stringhe

Questo argomento illustra in che modo Windows supporta 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. Per distinguerli dai caratteri ANSI a 8 bit, i caratteri UTF-16 vengono chiamati caratteri wide . 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;

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";

La tabella seguente elenca alcuni altri typedef correlati alla stringa:

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 in Windows, ha facilitato la transizione fornendo due set paralleli di API, uno per le stringhe ANSI e l'altro per le stringhe Unicode. Ad esempio, esistono 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 viene risolta 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 

La funzione è documentata sotto 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. Molti linguaggi mondiali richiedono Unicode. Se si usano stringhe ANSI, sarà impossibile localizzare l'applicazione. Anche le versioni ANSI sono meno efficienti, perché il sistema operativo deve convertire le stringhe ANSI in Unicode in fase di esecuzione. A seconda delle preferenze, è possibile chiamare le funzioni Unicode in modo esplicito, ad esempio SetWindowTextW o usare le macro. Le API di Windows più recenti in genere hanno solo una versione Unicode.

TCHAR

In alcuni casi può essere 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") oppure _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.

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++ li imposta entrambi per impostazione predefinita quando si crea un nuovo progetto.

Avanti

Che cos'è una finestra?