Condividi tramite


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 effettua il porting 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 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 di caratteri Unicode 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 affermazioni possono essere riscritte come segue 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 essere sempre tradotte da Unicode a ASCII, anche se alcuni del testo circostante non possono. La funzione atoi si arresta su qualsiasi carattere diverso da una cifra.

L'applicazione può usare la funzione nls (National Language Support) LCMapString per elaborare il testo che include le cifre native fornite per alcuni degli script in Unicode.

Cautela

L'uso della funzione wcstombs può compromettere erroneamente 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 effettuata perché, con set di caratteri a byte doppio (DBCS), ogni carattere Unicode può essere mappato a due caratteri consecutivi a 8 bit. 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.

 

Uso di Unicode e Set di Caratteri