Platform SDK: International Features

Using Functions That Have No Unicode Equivalents

Win32 functions that have not been exported in a Unicode version have typically been replaced by more powerful or extended functions that do support Unicode. If you are porting code that calls the OpenFile function, for example, you can support Unicode by using the CreateFile function instead.

If a function has no Unicode equivalent, you can map characters to and from 8-bit character sets before and after the function call. For example, the number-formatting functions atoi and itoa use only the digits 0 through 9. Normally, mapping Unicode to 8-bit characters could cause loss of data, but this can be avoided by making the code type-independent and conditionalizing the expressions. For example, the following statements are type-dependent and should be changed to support Unicode.

    char str[4]; 
 
    num = atoi(str); 

These statements could be rewritten as follows to make them type independent.

    TCHAR tstr[4]; 
 
    CHAR strTmp[SIZE]; 
 
    #ifdef UNICODE 
 
    wcstombs(strTmp, (const wchar_t *) tstr, sizeof(strTmp)); 
 
    num = atoi(strTmp); 
 
    #else 
 
    num = atoi(tstr); 
 
    #endif 

In this example, the wcstombs function is the standard C function that translates Unicode to ASCII. The example relies on the fact that the digits 0 through 9 can always be translated from Unicode to ASCII, even if some of the surrounding text cannot. The atoi function stops at any character that is not a digit. You can use the LCMapString function if you need to process text that includes the native digits provided for some of the scripts in Unicode.