2009-05-26 11 views
7

Tengo que convertir la codificación de una salida de cadena de una aplicación VB6 a una codificación específica.¿Cómo puedo determinar mediante programación la página de códigos predeterminada actual de Windows?

El problema es que no sé la codificación de la cadena, debido a que:

De acuerdo con la documentación de Visual Basic 6 al acceder a determinadas funciones API de las cadenas Unicode internas se convierten en cadenas ANSI utilizando el página de códigos predeterminada de Windows.

Por eso, la codificación de la salida de cadena puede ser diferente en diferentes sistemas, pero tengo que saberlo para realizar la conversión.

¿Cómo puedo leer la página de códigos predeterminada utilizando la API de Win32 o, si no hay otra forma, leyendo el registro?

Respuesta

14

¡Podría ser aún más sucinto al usar GetACP - la llamada API Win32 para devolver la página de códigos predeterminada! (Página de códigos por defecto es a menudo llamado "ANSI")

int nCodePage = GetACP(); 

También muchas llamadas a la API (tales como MultiByteToWideChar) aceptar el valor constante CP_ACP (cero) que siempre means "use the system code page". Por lo tanto, es probable que no necesite conocer la página de códigos actual, según lo que quiera hacer con ella.

+0

Gracias a quien sugirió la edición para mencionar "ANSI" y mejorar el formato del código ligeramente. Buena idea, lo he editado en consecuencia yo mismo. – MarkJ

+1

Este uso de ANSI es bastante absurdo. Las páginas de códigos de Windows a menudo se denominan páginas de códigos ANSI, porque estaban destinadas a convertirse en estándar; ellos nunca lo hicieron. Usar entonces 'ANSI' para referirse solo al predeterminado es muy confuso y nunca lo he visto usado así. – MicroVirus

1

GetSystemDefaultLCID() le proporciona la configuración regional del sistema.

Si el LCID no es suficiente y que realmente necesita el código de página, utilice este código:

TCHAR szCodePage[10]; 
    int cch= GetLocaleInfo(
    GetSystemDefaultLCID(), // or any LCID you may be interested in 
    LOCALE_IDEFAULTANSICODEPAGE, 
    szCodePage, 
    countof(szCodePage)); 

    nCodePage= cch>0 ? _ttoi(szCodePage) : 0; 
+0

O más sucintamente, como en mi respuesta: 'int nCodePage = GetACP();' :) Es bastante largo para obtener el nombre de la página de códigos y luego obtener la página de códigos como una cadena y luego convertir a un entero – MarkJ

+0

Indeed _more succinctly_ :-D –

0

que trabajó para mí, gracias, pero se puede escribir de forma más sucinta como:

UINT nCodePage = CP_ACP; 
const int cch = ::GetLocaleInfo(LOCALE_SYSTEM_DEFAULT, 
    LOCALE_RETURN_NUMBER|LOCALE_IDEFAULTANSICODEPAGE, 
    (LPTSTR)&nCodePage, sizeof(nCodePage)/sizeof(_TCHAR)); 
+0

O incluso más sucinto, como en mi respuesta: 'int nCodePage = GetACP();' :) Es un poco largo para obtener el * nombre * de la página de códigos y luego buscar el código identificador del nombre – MarkJ

Cuestiones relacionadas