Как я могу вручную определить кодовую страницу и локаль текущей ОС
Есть ли способ, чтобы я вручную попросил пользователя просмотреть текущую кодовую страницу и локаль их ОС Windows? Есть ли параметр реестра, в котором хранится эта информация?
Также было бы полезно, если бы техника работала вплоть до Windows 2000.
4 ответа
chcp выдаст вам активную кодовую страницу.
systeminfo покажет локаль системы и локаль ввода, среди прочего.
"Примечание. Эта команда (systeminfo) недоступна в Windows 2000, но вы по-прежнему можете запрашивать компьютер под управлением Windows 2000, выполнив эту команду на компьютере под управлением Windows XP или Windows 2003 и установив удаленный компьютер на компьютер под управлением Windows 2000. Если текущий пользователь выполнил вход, выполнивший это Команда уже имеет привилегию на удаленной машине (например, Администраторы домена), вам не нужно использовать /u и /p."
Отсюда
Обратите внимание, что данная система имеет две активные кодовые страницы, представляющие интерес, что определяется устаревшим параметром с именем language для программ, не поддерживающих Юникод, который ранее назывался системным языком (см. Базовый раздел в нижней части):
- кодовая страница OEM для использования устаревшими консольными приложениями,
- кодовая страница ANSI для использования устаревшими приложениями с графическим интерфейсом.
Примечание. Есть еще две кодовые страницы, но они больше не используются и поэтому здесь не обсуждаются: код EBCDIC и кодовая страница Mac (до OS X) - см. Документацию WinAPI.
Активную кодовую страницу OEM легче всего получить через chcp
, как показано в полезном ответе Забытой точки с запятой - при условии, что он не был явно изменен в сеансе с 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, ACP
кодовая страница ANSI.
Метод на основе реестра, который также работает на старых системах вплоть до 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, используемую, когда программы, не поддерживающие Юникод, вызывают не-Юникод (ANSI) версии Windows API, в частности, версию ANSI
TextOut
функция для перевода строк в Unicode и из нее, которая, в частности, определяет, как строки программы отображаются в графическом интерфейсе.- Используя стандартные функции, вы не можете изменять эту кодовую страницу по требованию, поэтому вы не можете выборочно запускать программы, не поддерживающие Юникод, с другой кодовой страницей ANSI.
- Arioch 'The на унаследованную программу Microsoft AppLocale, что до Windows 7 можно использовать для запуска отдельной программы с возможностью выбора языка системы по требованию; однако, похоже, что он больше не доступен для загрузки и больше не работает в Windows 10.
- Locale Emulator, стороннее решение с открытым исходным кодом, по-видимому, определяет, где остановился AppLocale (я не пробовал), и поддерживается для 32-разрядных приложений в Windows 10.
кодовая страница OEM, чтобы сделать активным по умолчанию в окнах консоли, как отражено
chcp
,- Активная кодовая страница окна консоли определяет, как ввод и вывод с клавиатуры из консольных приложений интерпретируется и отображается.
- Обратите внимание, что это означает, что даже вывод консольных приложений Unicode транслируется в активную кодовую страницу, что может привести к потере информации; использование псевдокодовой страницы
65001
, представляющее кодировку UTF-8 Unicode, является решением, но оно может привести к тому, что устаревшие программы командной строки будут неправильно интерпретировать данные и даже потерпеть неудачу - подробности см. в этом ответе StackOverflow.
- Обратите внимание, что это означает, что даже вывод консольных приложений Unicode транслируется в активную кодовую страницу, что может привести к потере информации; использование псевдокодовой страницы
- В отличие от кодовой страницы 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
API-интерфейс Windows, который возвращает активную кодовую страницу, называется GetConsoleOutputCP ().