Como posso programaticamente determinar a página de código padrão atual do Windows?

votos
7

Eu tenho que converter a codificação de uma saída de cadeia de um aplicativo VB6 para uma codificação específica.

O problema é, eu não sei a codificação da cadeia, por causa disso:

De acordo com a documentação VB6 ao acessar certas funções da API as cadeias de caracteres Unicode internos são convertidos em seqüências de caracteres ANSI usando a página de código padrão do Windows.

Por causa disso, a codificação da saída de string pode ser diferente em sistemas diferentes, mas eu tenho que conhecê-lo para realizar a conversão.

Como posso ler a página de códigos padrão usando a API Win32 ou - se não há nenhuma outra maneira - através da leitura do registro?

Publicado 26/05/2009 em 11:06
fonte usuário
Em outras línguas...                            


3 respostas

votos
14

Poderia ser ainda mais sucinta usando GetACP - a chamada API Win32 para retornar a página de código padrão! (Página de código padrão é muitas vezes chamado de "ANSI")

int nCodePage = GetACP(); 

Também muitas chamadas de API (como MultiByteToWideChar) aceitar o valor constante CP_ACP(zero), que sempre significa "usar a página de código do sistema" . Então você não pode realmente precisa saber a página de código atual, dependendo do que você quer fazer com ele.

Respondeu 28/05/2009 em 17:52
fonte usuário

votos
1

GetSystemDefaultLCID () dá-lhe a localidade do sistema.

Se o LCID não é suficiente e que você realmente precisa a página de códigos, use 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;
Respondeu 26/05/2009 em 11:19
fonte usuário

votos
0

Que funcionou para mim, obrigado, mas pode ser escrito de forma mais sucinta como:

UINT nCodePage = CP_ACP;
const int cch = ::GetLocaleInfo(LOCALE_SYSTEM_DEFAULT,
     LOCALE_RETURN_NUMBER|LOCALE_IDEFAULTANSICODEPAGE,
     (LPTSTR)&nCodePage, sizeof(nCodePage) / sizeof(_TCHAR) );
Respondeu 28/05/2009 em 17:46
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more