Як я можу вручну визначити CodePage та Locale поточної ОС


13

Чи є спосіб, щоб я вручну користувачеві шукав поточну кодова сторінку та локальну локальну систему Windows? Чи є параметр реєстру, який зберігає цю інформацію?

Було б також корисно, якби техніка спрацювала аж до Windows 2000.

Відповіді:


16

chcp отримає вам активну кодову сторінку.

systeminfo , серед іншого, відображатиме локальну систему та локальну систему введення.

" Примітка . Ця команда (системна інформація) недоступна в Windows 2000, але ви все одно можете запитувати комп'ютер Windows 2000, виконавши цю команду на комп'ютері Windows XP або Windows 2003 та встановивши віддалений комп'ютер на комп'ютер Windows 2000. Якщо поточний вхід користувача, який виконує це, команда вже має привілей на віддаленій машині (наприклад, Адміністратори домену), вам не доведеться використовувати / u та / p. "
Від сюди .


1
Будьте в курсі, що chcpви отримаєте активну кодову сторінку OEM . Як стверджує mklement у своїй відповіді, завжди існує ще одна активна сторінка коду, яку використовує Windows, кодова сторінка ANSI. Для отримання додаткової інформації див відповідь mklement .
kangalioo

6

Зауважте, що дана система має дві активні сторінки коду, що цікавлять , як це визначено застарілим налаштуванням з назвою мови для програм Unicode , раніше відомих як системний локал (див. Нижній розділ для довідкової інформації):

  • OEM кодова сторінка для використання застарілих консольних додатків,
  • ANSI кодову сторінку для використання застарілих GUI - додатків.

Примітка. Є ще дві кодові сторінки, але вони вже рідко використовуються і тому тут не обговорюються: код EBCDIC та кодова сторінка Mac (до OS X) для Mac - див . Документи 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, сторінка 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)                                                                                                                          

Довідкова інформація :

Системна локаль - це застаріле ім'я для того, що зараз більш описово називається мовою для програм, які не є Unicode (див. Термінологію 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 .

Незважаючи на локальне слово, яке вживається у попередньому терміні, і мова слова в поточному терміні:

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

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

Однак, коли ви змінюєте налаштування через панель керування, ви вибираєте налаштування за певним місцем.

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


GetACP()функція - technet.microsoft.com/en-us/dd318070 - що цікаво, посилання в розділі зауважень прямо говорить про те, що значення функції повернення НЕ відображає вибрану користувачем мову вводу за замовчуванням та мову GUI, а щось зовсім інше ...
Arioch 'The

Справді, @ Arioch'The - це те, що я намагався уточнити в розділі довідкова інформація: системний локал (a) визначає кодові сторінки (але немає інших параметрів мови) загальносистемних , (b) незалежно від конкретного користувача локал. Зауважте, як зазначено пов’язану сторінку (наголос додано): "Повертає поточний ідентифікатор кодової сторінки Windows ANSI (ACP) для операційної системи ". Щодо потенційної заміни сторони AppLocale: я додав посилання на відповідь.
mklement

1
Це зауваження / посилання GetACP, я вважаю, важливим як підтвердження "Божого слова" про те, що конверсія за замовчуванням MBCS-в-Unicode призначена для незалежного від користувача та ОС-глобальної, а не лише детальної реалізації в деяких версіях Windows.
Аріох '

1
Ймовірно, сьогодні і перед-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 '


0

API Windows, який повертає активну кодову сторінку, є GetConsoleOutputCP () .


активна кодова сторінка OEM (не кодова сторінка ANSI) і лише в тому випадку, якщо вона була скасована за допомогою ( chcpкоманда консолі )
Arioch '
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.