Como posso determinar manualmente o CodePage e o local do sistema operacional atual

13

Existe uma maneira de eu manualmente fazer com que um usuário procure a página de códigos e a localidade atuais do sistema operacional Windows? Existe uma configuração de registro que armazena essas informações?

Também seria útil se a técnica funcionasse desde o Windows 2000.

epotter
fonte

Respostas:

16

O chcp vai te dar a página de código ativa.

systeminfo exibirá a localidade do sistema e a localidade de entrada, entre outras coisas.

" Nota : Este comando (informações do sistema) não está disponível no Windows 2000, mas você ainda pode consultar o computador com o Windows 2000 executando este comando no computador com Windows XP ou Windows 2003 e configurar o computador remoto para o computador com o Windows 2000. Se o usuário atual efetuar logon neste O comando já possui privilégios na máquina remota (por exemplo, Administradores de Domínio), você não precisa usar / u e / p. "
A partir daqui .

Ponto e vírgula esquecido
fonte
1
Esteja ciente de que chcpvocê receberá a página de código OEM ativa . Como mklement afirma em sua resposta, sempre há outra página de código ativa em uso pelo Windows, a página de código ANSI. Para mais informações, consulte a resposta de mklement .
kangalioo
6

Observe que um determinado sistema possui duas páginas de códigos ativas de interesse , conforme determinado pela configuração herdada denominada language para programas não-Unicode , anteriormente conhecida como localidade do sistema (consulte a seção inferior para obter informações detalhadas):

  • a página de código OEM para uso por aplicativos de console herdados ,
  • a página de código ANSI para uso dos aplicativos GUI herdados .

Nota: Existem mais duas páginas de código, mas elas raramente são mais usadas e, portanto, não são discutidas aqui: o código EBCDIC e a página de código Mac (anterior ao OS X) - consulte os documentos do WinAPI .

A página de código OEM ativa é mais facilmente obtida via chcp, conforme mostrado na resposta útil do Forgotten Semicolon - assumindo que não foi explicitamente alterada na sessão com chcp <codePageNum>.

Determinar a página de código ANSI ativa não é tão simples, mas o PowerShell pode ajudar, também na determinação do nome e idioma do código do idioma do sistema:

No Windows 8+ / Windows Server 2012+ : Use o Get-WinSystemLocalecmdlet:

Get-WinSystemLocale | Select-Object Name, DisplayName, 
                        @{ n='OEMCP'; e={ $_.TextInfo.OemCodePage } }, 
                        @{ n='ACP';   e={ $_.TextInfo.AnsiCodePage } }

Nota: Pode ser tentador usar [cultureinfo]::CurrentCulture.TextInfo.ANSICodePage, por exemplo, mas isso não reflete necessariamente a página de código ANSI ativa em todo o sistema ; em vez disso, é a página de código ANSI associada à localidade (cultura) do usuário atual , que pode ser diferente.

Em um sistema inglês dos EUA, o acima gera:

Name  DisplayName             OEMCP  ACP
----  -----------             -----  ---
en-US English (United States)   437 1252

OEMCPé a página de código OEM, ACPa página de código ANSI.

Um método baseado em registro que também funciona em sistemas mais antigos até o Windows XP :

# Get the code pages:
Get-ItemProperty HKLM:\SYSTEM\CurrentControlSet\Control\Nls\CodePage | 
     Select-Object OEMCP, ACP

Em um sistema inglês dos EUA, o acima gera:

OEMCP ACP 
----- --- 
437   1252

Se você também deseja obter o nome [amigável] e o LCID da localidade do sistema (observe que os LCIDs estão obsoletos):

[Globalization.CultureInfo]::GetCultureInfo([int] ('0x' + (
        Get-ItemProperty 'HKLM:\SYSTEM\CurrentControlSet\Control\Nls\Language' Default
      ).Default)
)

Em um sistema inglês dos EUA, o acima gera:

LCID             Name             DisplayName                                                                                                                                      
----             ----             -----------                                                                                                                                      
1033             en-US            English (United States)                                                                                                                          

Informações básicas :

Código do idioma do sistema é o nome legado para o que agora é chamado de forma mais descritiva de linguagem para programas não Unicode (consulte a terminologia do NLS ) e, como os nomes sugerem:

  • A configuração se aplica apenas a programas herdados (programas que não oferecem suporte a Unicode).

  • Aplica - se a todo o sistema , independentemente das configurações de localidade de um determinado usuário , e são necessários privilégios administrativos para alterá-lo.

É importante observar que essa é uma configuração herdada , porque as páginas de código não se aplicam mais a programas que usam Unicode internamente e chamam as versões Unicode da API do Windows.

Notavelmente, ele determina as páginas de código ativas , ou seja, a codificação de caracteres usada por padrão :

  • a página de código ANSI a ser usada quando programas não-Unicode chamam as versões não-Unicode (ANSI) da API do Windows, principalmente a versão ANSI da TextOutfunção para converter seqüências de caracteres de e para Unicode, que determina notavelmente como as seqüências de caracteres do programa são processadas no GUI .

  • a página de código OEM para ativar por padrão nas janelas do console , conforme refletido em chcp.

    • A página de código ativa de uma janela do console determina como a entrada e a saída do teclado dos aplicativos do console são interpretadas e exibidas .
      • Observe que isso significa que mesmo a saída dos aplicativos do console Unicode é convertida para a página de código ativa, o que pode resultar em perda de informações; o uso da página de pseudo-código 65001, que representa a codificação UTF-8 do Unicode, é uma solução, mas que pode fazer com que os programas de linha de comando herdados interpretem mal os dados e até falhem - consulte esta resposta do StackOverflow para obter detalhes.
    • Diferente da página de código ANSI, você pode alterar a página de código [OEM] ativa sob demanda para uma determinada janela do console ; por exemplo, para mudar para a página de código OEM 850, executado chcp 850em cmd.exe, e $OutputEncoding = [console]::InputEncoding = [console]::OutputEncoding = [text.encoding]::GetEncoding(850)em PowerShell.
  • Além disso, as páginas de código EBCDIC e Mac raramente usadas mais .

Apesar da palavra localidade usada no termo herdado e da palavra idioma no termo atual:

  • Os únicos aspectos controlados pela configuração são o conjunto de páginas de códigos ativas e as fontes de bitmap padrão , não também outros elementos de um código de idioma (que são controlados pelas configurações de código de idioma no nível do usuário).

  • Uma determinada página de código é normalmente compartilhada por muitos códigos de idioma e abrange vários idiomas; por exemplo, a página de código amplamente usada1252 é usada por muitos idiomas da Europa Ocidental, incluindo o inglês.

No entanto, quando você altera a configuração pelo Painel de Controle, escolhe a configuração por meio de um código de idioma específico.

Para obter uma lista de todas as páginas de código do Windows, consulte https://docs.microsoft.com/en-us/windows/desktop/Intl/code-page-identifiers

mklement
fonte
GetACP()função - technet.microsoft.com/en-us/dd318070 - que é um link interessante, a seção de comentários diz que esse valor de retorno da função NÃO representa o idioma de entrada padrão selecionado e a linguagem GUI do usuário, mas algo completamente diferente ...
Arioch 'The
De fato, @ Arioch'The - foi o que tentei esclarecer na seção de informações básicas: o código do idioma do sistema (a) determina as páginas de código (mas nenhuma outra configuração do código do idioma) em todo o sistema , (b) independentemente de um determinado usuário localidade. Observe como a página vinculada declara (ênfase adicionada): "Retorna o atual identificador de página de código (ANSI) do Windows para o sistema operacional ". Quanto à possível substituição de terceiros do AppLocale: adicionei um link para a resposta.
precisa saber é o seguinte
1
Isso GetACP observação / link é que eu acho importante como uma "palavra de Deus" confirmação de que a conversão padrão MBCS-to-Unicode é destinado para ser independente de utilizador e OS-global, não apenas detalhe de implementação em algumas versões do Windows.
Arioch '
1
Provavelmente hoje, tanto o MAC pré-UNIX quanto o EBCDIC pertencem igualmente ao nicho "apenas de alguma importância histórica". No entanto, estou um pouco ligado a esse MAC CP, porque eles conseguiram fazer outra variante de marcar novas linhas em arquivos de texto sem formatação, diferentes das árvores UNIX e DOS-Win-OS / 2. Foi uma caixa de canto exótica que eu memorizei.
Arioch 'The
1
Obrigado. Link mais tópico - docs.microsoft.com/en-us/windows/desktop/Intl/… - e EBCDIC está marcado como "Windows 2000" - portanto, antes do w2k, provavelmente não existia e, durante todos os anos desde então, ninguém se incomodou para atualizar as fontes de conversão de cabeçalhos que eu usei :-D
Arioch 'The
1

O código do idioma também pode ser visto no msinfo32.

epotter
fonte
0

A API do Windows que retorna a página de código ativa é GetConsoleOutputCP () .

mão lenta
fonte
página de código OEM ativa (não página de código ANSI) e somente se for substituída pelo uso ( chcpcomando do console )
Arioch 'The