2011-06-21 19 views
6

Estoy trabajando en un proyecto de internacionalización. ¿Los otros idiomas, como el árabe o el chino, usan representaciones diferentes para los dígitos además de 0-9? Si es así, ¿hay versiones de atoi() que representen estas otras representaciones?atoi() con otros idiomas

Debo agregar que me preocupa principalmente el análisis de las entradas del usuario. Si los usuarios escriben alguna otra representación, quiero estar seguro de reconocerla como un número y tratarla en consecuencia.

+0

http://stackoverflow.com/questions/5068972/c-atoi-for-wide-chars-on-linux –

+0

Debe explicar en el enlace: Si el uso de 'wchar_t' tiene sentido en su sistema o no depende sobre qué tipo de codificación estás usando; para UTF-8, lo normal sería 'strtol()'/'atoi()', pero si tienes conjuntos de caracteres multibyte/constante no lo harán. –

Respuesta

6

Puedo usar std::wistringstream y configuración regional para generar este número entero.

#include <sstream> 
#include <locale> 
using namespace std; 

int main() 
{ 
    locale mylocale("en-EN"); // Construct locale object with the user's default preferences 
    wistringstream wss(L"1"); // your number string 
    wss.imbue(mylocale); // Imbue that locale 
    int target_int = 0; 
    wss >> target_int; 
    return 0; 
} 

More info on stream class y on locale class.

+0

+1 para una solución estándar, aunque es altamente dependiente de las configuraciones regionales C disponibles en el sistema. – rubenvb

2

Si le preocupan los caracteres internacionales, debe asegurarse de utilizar una función "Unicode-aware" como _wtoi (..).

También puede comprobar si es compatible con UNICODE para que sea independiente de tipo (de MSDN):

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, el estándar C wcstombs función de biblioteca se traduce Unicode a ASCII. El ejemplo se basa en en el hecho de que los dígitos 0 a 9 siempre se pueden traducir de Unicode a ASCII, incluso si parte del texto circundante no puede. La función atoi se detiene en cualquier carácter que no sea un dígito.

La aplicación puede utilizar la función Nacional Soporte de idiomas (NLS) LCMapString para procesar texto que incluye los dígitos nativas previstas algunos de los scripts en Unicode.

Precaución El uso incorrecto de la función wcstombs puede comprometer la seguridad de su aplicación. Hacer asegurarse de que el tampón de aplicación para la cadena de caracteres de 8 bits es al menos de tamaño 2 * (char_length 1), donde char_length representa la longitud de la cadena Unicode. Esta restricción se realiza porque, con conjuntos de caracteres de doble byte (DBCS), , cada carácter Unicode se puede correlacionar con dos caracteres consecutivos de 8 bits. Si el búfer no contiene toda la cadena , la cadena de resultado no es con terminación nula, lo que representa un riesgo de seguridad . Para obtener más información acerca de la seguridad de la aplicación , vea Seguridad Consideraciones: Internacional Características.

+0

Creo que Visual C++ tiene algunas macros integradas que hacen la mayor parte de este cambio por usted. – Brian

Cuestiones relacionadas