Как я могу вручную определить кодовую страницу и локаль текущей ОС

13

Есть ли способ, чтобы я вручную попросил пользователя просмотреть текущую кодовую страницу и локаль их ОС Windows? Есть ли параметр реестра, в котором хранится эта информация?

Также было бы полезно, если бы техника работала вплоть до Windows 2000.

epotter
источник

Ответы:

16

chcp выдаст вам активную кодовую страницу.

systeminfo покажет локаль системы и локаль ввода, среди прочего.

« Примечание . Эта команда (systeminfo) недоступна в Windows 2000, но вы по-прежнему можете запрашивать компьютер под управлением Windows 2000, выполнив эту команду на компьютере под управлением Windows XP или Windows 2003 и установив удаленный компьютер на компьютер под управлением Windows 2000. Если текущий пользователь выполнил вход, выполнивший это команда уже имеет привилегию на удаленном компьютере (например, администраторы домена), вам не нужно использовать / u и / p. "
От сюда .

Забытая точка с запятой
источник
1
Имейте в chcpвиду, что вы получите активную кодовую страницу OEM . Как Макклемент заявляет в своем ответе, всегда есть другая активная кодовая страница, используемая Windows, кодовая страница ANSI. Для получения дополнительной информации см . Ответ mklement .
kangalioo
6

Обратите внимание, что данная система имеет две активные кодовые страницы, представляющие интерес , что определяется устаревшим параметром с именем language для программ , не поддерживающих Юникод , который ранее назывался языковым стандартом системы (дополнительную информацию см. В нижнем разделе):

  • OEM кодовая страница для использования устаревших консольных приложений,
  • ANSI кодовую страницу для использования устаревших GUI - приложений.

Примечание. Есть еще две кодовые страницы, но они редко используются и поэтому здесь не обсуждаются: код EBCDIC и кодовая страница Mac (до OS X) - см. Документацию WinAPI .

Активная кодовая страница OEM наиболее легко получить с помощью chcp, как показана на полезном ответ Забытых SEMICOLON в - если он не был явно изменен на сессии с chcp <codePageNum>.

Определить активную кодовую страницу ANSI не так просто, но PowerShell может помочь в определении имени и языка языкового стандарта системы:

В ОС Windows 8+ / Windows Server 2012+ : Используйте Get-WinSystemLocaleкоманду:

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

Примечание. [cultureinfo]::CurrentCulture.TextInfo.ANSICodePageНапример, это может быть заманчиво , но это не обязательно отражает общесистемную активную кодовую страницу ANSI; вместо этого это кодовая страница ANSI, связанная с локалью (культурой) текущего пользователя , которая может отличаться.

В американо-английской системе вышеприведенное дает:

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

OEMCPкодовая страница OEM, кодовая страница ACPANSI.

Метод на основе реестра , который также работает на старых системах вплоть до Windows XP :

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

В американо-английской системе вышеприведенное дает:

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

Если вы также хотите получить [дружественное] имя и LCID системного языкового стандарта (хотя обратите внимание, что идентификаторы LCID устарели):

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

В американо-английской системе вышеприведенное дает:

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

Справочная информация :

Системный языковой стандарт - это устаревшее имя для того, что теперь более описательно называется языком для программ, не поддерживающих Юникод (см. Терминологию NLS ), и, как следует из названий:

  • Этот параметр применяется только к устаревшим программам (программам, которые не поддерживают Unicode).

  • Он применяется в масштабе всей системы независимо от настроек локали данного пользователя , и для его изменения требуются права администратора.

Важно отметить, что это устаревший параметр , поскольку кодовые страницы больше не применяются к программам, которые используют Unicode для внутреннего использования и вызывают Unicode-версии Windows API.

В частности, он определяет активные кодовые страницы , то есть кодировку символов, используемую по умолчанию :

  • кодовая страница ANSI использовать , когда программа не-Unicode называет (ANSI) версию не-Unicode на Windows API , , в частности , версия ANSI из TextOutфункции для перевода строки и из Unicode, которые , в частности определяет , как строки этой программы визуализации в GUI .

  • кодовая страница OEM сделать активным по умолчанию в консоли окна , как это отражается chcp.

    • Активная кодовая страница окна консоли определяет, как ввод и вывод с клавиатуры из консольных приложений интерпретируется и отображается .
      • Обратите внимание, что это означает, что даже выходные данные консольных приложений Unicode транслируются в активную кодовую страницу, что может привести к потере информации; Использование псевдокодовой страницы 65001, которая представляет кодировку UTF-8 Unicode, является решением, но оно может привести к тому, что устаревшие программы командной строки будут неправильно интерпретировать данные и даже потерпеть неудачу - подробности см. в этом ответе StackOverflow .
    • В отличие от кодовой страницы ANSI, вы можете изменить активную кодовую страницу [OEM] по запросу для данного окна консоли ; например, чтобы перейти на кодовую страницу OEM 850, бегите chcp 850в cmd.exe, и $OutputEncoding = [console]::InputEncoding = [console]::OutputEncoding = [text.encoding]::GetEncoding(850)в PowerShell.
  • Кроме того, редко используются кодовые страницы EBCDIC и Mac .

Несмотря на то, что в текущем термине используется слово locale, а в текущем термине слово language :

  • В только аспекты , контролируемые установки являются набор активных кодовых страниц и по умолчанию в растровые шрифты , а не также и другие элементы местности (которые управляются параметрами пользовательского уровня локализации).

  • Данная кодовая страница обычно используется многими языками и охватывает несколько языков; Например, широко используемая 1252кодовая страница используется многими западноевропейскими языками, включая английский.

Однако, когда вы меняете настройку через панель управления, вы выбираете настройку в зависимости от конкретной локали.

Список всех кодовых страниц Windows см. На странице https://docs.microsoft.com/en-us/windows/desktop/Intl/code-page-identifiers.

mklement
источник
GetACP()функция - technet.microsoft.com/en-us/dd318070 - это интересная ссылка, в разделе замечаний прямо говорится, что возвращаемое значение этой функции НЕ представляет выбранный пользователем язык ввода по умолчанию и язык GUI, но что-то совершенно другое ...
Arioch 'The
Действительно, @ Arioch'The - это то, что я пытался уточнить в разделе справочной информации: языковой стандарт системы (а) определяет кодовые страницы (но не другие настройки языкового стандарта) для всей системы , (б) независимо от данного пользователя локали. Обратите внимание на то, как указывается связанная страница (выделение выделено): «Возвращает текущий идентификатор кодовой страницы (ACP) Windows ANSI для операционной системы ». Что касается потенциальной замены AppLocale третьей стороной: я добавил ссылку на ответ.
19
1
Это замечание / ссылка GetACP я считаю важным как «слово бога», подтверждающее, что преобразование по умолчанию из MBCS в Unicode предназначено для того, чтобы быть независимым от пользователя и глобальным для ОС, а не просто деталями реализации в некоторых версиях Windows.
Ариох '
1
Вероятно, сегодня как pre-UNIX MAC, так и EBCDIC в равной степени принадлежат к нише «только некоторой исторической важности». Однако я несколько привязан к этому MAC CP, потому что им удалось создать еще один вариант маркировки новых строк в текстовых файлах, отличающийся от деревьев UNIX и DOS-Win-OS / 2. Это был экзотический угловой случай, который я запомнил.
Ариох '
1
Благодарю. Более актуальная ссылка - docs.microsoft.com/en-us/windows/desktop/Intl/… - и EBCDIC помечена как «Windows 2000» - так что до w2k ее, вероятно, не существовало, и за все эти годы никто не беспокоился обновить источники преобразования заголовков, которые я использовал :-D
Arioch 'The
1

Локаль также можно увидеть в msinfo32.

epotter
источник
0

Windows API, который возвращает активную кодовую страницу, называется GetConsoleOutputCP () .

медленная рука
источник
активная кодовая страница OEM (не кодовая страница ANSI) и только если она была переопределена при использовании (консольная chcpкоманда)
Arioch 'The