Compartir a través de


Uso de funciones que no tienen equivalentes Unicode

Las funciones que no se han implementado con una versión Unicode normalmente se han reemplazado por funciones más eficaces o extendidas que admiten Unicode . Por ejemplo, si va a portar código que llama a la función OpenFile , la aplicación puede admitir Unicode mediante la función CreateFile en su lugar.

Si una función no tiene ningún equivalente Unicode, la aplicación puede asignar caracteres a y desde juegos de caracteres de 8 bits antes y después de la llamada de función. Por ejemplo, las funciones de formato numérico atoi y itoa usan solo los dígitos del 0 al 9. Normalmente, la asignación de Unicode a caracteres de 8 bits provoca la pérdida de datos, pero esto se puede evitar haciendo que el tipo de código sea independiente y haga que las expresiones sean condicionales. Las instrucciones del ejemplo siguiente, escritas para caracteres de 8 bits, dependen del tipo y deben cambiarse para admitir Unicode.

char str[4] = "137";

int num = atoi(str);

Estas instrucciones se pueden reescribir de la siguiente manera para que sean independientes del 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 

En este ejemplo, la función de biblioteca estándar de C wcstombs traduce Unicode a ASCII. El ejemplo se basa en el hecho de que los dígitos del 0 al 9 siempre se pueden traducir de Unicode a ASCII, aunque algunos de los texto circundantes no puedan traducirse. La función atoi se detiene en cualquier carácter que no sea un dígito.

La aplicación puede usar la función LCMapString de compatibilidad con idiomas nacionales (NLS) para procesar texto que incluya los dígitos nativos proporcionados para algunos de los scripts de Unicode.

Precaución

El uso incorrecto de la función wcstombs puede poner en peligro la seguridad de la aplicación. Asegúrese de que el búfer de la aplicación para la cadena de 8 bits tiene al menos un tamaño de 2*(char_length +1), donde char_length representa la longitud de la cadena Unicode. Esta restricción se realiza porque, con juegos de caracteres de doble byte (DBCS), cada carácter Unicode se puede asignar a dos caracteres consecutivos de 8 bits. Si el búfer no contiene toda la cadena, la cadena de resultado no termina en null, lo que supone un riesgo de seguridad. Para obtener más información sobre la seguridad de las aplicaciones, consulte Consideraciones de seguridad: Características internacionales.

 

Usar Unicode y juegos de caracteres