Uso di funzioni senza equivalenti Unicode
Le funzioni che non sono state implementate con una versione Unicode sono in genere state sostituite da funzioni più potenti o estese che supportano Unicode. Ad esempio, se si esegue la conversione di codice che chiama la funzione OpenFile , l'applicazione può supportare Unicode usando invece la funzione CreateFile .
Se una funzione non ha un equivalente Unicode, l'applicazione può eseguire il mapping dei caratteri da e verso i set di caratteri a 8 bit prima e dopo la chiamata di funzione. Ad esempio, le funzioni di formattazione numerica atoi e itoa usano solo le cifre da 0 a 9. In genere, il mapping unicode a caratteri a 8 bit causa la perdita di dati, ma ciò può essere evitato rendendo il tipo di codice indipendente e rendendo condizionale le espressioni. Le istruzioni nell'esempio seguente, scritte per i caratteri a 8 bit, sono dipendenti dal tipo e devono essere modificate per supportare Unicode.
char str[4] = "137";
int num = atoi(str);
Queste istruzioni possono essere riscritte come indicato di seguito per renderle indipendenti dal tipo.
TCHAR tstr[4] = TEXT("137");
#ifdef UNICODE
size_t cCharsConverted;
CHAR strTmp[SIZE]; // SIZE equals (2*(sizeof(tstr)+1)). This ensures enough
// room for the multibyte characters if they are two
// bytes long and a terminating null character. See Security
// Alert below.
wcstombs_s(&cCharsConverted, strTmp, sizeof(strTmp), (const wchar_t *)tstr, sizeof(strTmp));
num = atoi(strTmp);
#else
int num = atoi(tstr);
#endif
In questo esempio la funzione della libreria C standard wcstombs converte Unicode in ASCII. L'esempio si basa sul fatto che le cifre da 0 a 9 possono sempre essere tradotte da Unicode a ASCII, anche se alcuni del testo circostante non possono. La funzione atoi si arresta in corrispondenza di qualsiasi carattere diverso da una cifra.
L'applicazione può usare la funzione LCMapString (National Language Support) per elaborare il testo che include le cifre native fornite per alcuni script in Unicode.
Attenzione
L'uso della funzione wcstombs in modo non corretto può compromettere la sicurezza dell'applicazione. Assicurarsi che il buffer dell'applicazione per la stringa di caratteri a 8 bit sia almeno di dimensione 2*(char_length +1), dove char_length rappresenta la lunghezza della stringa Unicode. Questa restrizione viene eseguita perché, con set di caratteri a byte doppio (DBCS), ogni carattere Unicode può essere mappato a due caratteri a 8 bit consecutivi. Se il buffer non contiene l'intera stringa, la stringa di risultato non viene terminata con null, comportando un rischio per la sicurezza. Per altre informazioni sulla sicurezza delle applicazioni, vedere Considerazioni sulla sicurezza: Funzionalità internazionali.
Argomenti correlati