Как поменять язык командной строки windows 10

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

Время прочтения
9 мин

Просмотры 22K

Введение

Консольные приложения до сих пор остаются наиболее востребованным видом приложений, большинство разработчиков оттачивают архитектуру и бизнес-логику именно в консоли. При этом они нередко сталкиваются с проблемой локализации — русский текст, который вполне адекватно отражается в исходном файле, при выводе на консоль приобретает вид т.н. «кракозябр».

В целом, локализация консоли Windows при наличии соответствующего языкового пакета не представляется сложной. Тем не менее, полное и однозначное решение этой проблемы, в сущности, до сих пор не найдено. Причина этого, главным образом, кроется в самой природе консоли, которая, являясь компонентом системы, реализованным статическим классом System.Console, предоставляет свои методы приложению через системные программы-оболочки, такие как командная строка или командный процессор (cmd.exe), PowerShell, Terminal и другие.
По сути, консоль находится под двойным управлением — приложения и оболочки, что является потенциально конфликтной ситуацией, в первую очередь в части использования кодировок.

Данный материал не предлагает строгий алгоритм действий, а направлен на описание узловых проблем, с которыми неизбежно сталкивается разработчик локализованного консольного приложения, а также некоторые возможные пути их разрешения. Предполагается, что это позволит разработчику сформировать стратегию работы с локализованной консолью и эффективно реализовать существующие технические возможности, большая часть которых хорошо описана и здесь опущена.

Виды консолей

В общем случае функции консоли таковы:

  • управление операционной системой и системным окружением приложений на основе применения стандартных системных устройств ввода-вывода (экран и клавиатура), использования команд операционной системы и/или собственно консоли;

  • запуск приложений и обеспечение их доступа к стандартным потокам ввода-вывода системы, также с помощью стандартных системных устройств ввода-вывода.

Основная консоль Windows — командная строка или иначе командный процессор (CMD). Большие возможности предоставляют оболочки PowerShell (PS), Windows PowerShell (WPS) и Terminal. По умолчанию Windows устанавливает Windows Power Shell мажорной версией до 5, однако предлагает перейти на новую версию — 7-ку, имеющую принципиальное отличие (вероятно, начинающееся с 6-ки) — кроссплатформенность. Terminal — также отдельно уставливаемое приложение, по сути интегратор всех ранее установленных оболочек PowerShell и командной строки.

Отдельным видом консоли можно считать консоль отладки Visual Studio (CMD-D).

Конфликт кодировок

Полностью локализованная консоль в идеале должна поддерживать все мыслимые и немыслимые кодировки приложений, включая свои собственные команды и команды Windows, меняя «на лету» кодовые страницы потоков ввода и вывода. Задача нетривиальная, а иногда и невозможная — кодовые страницы DOS (CP437, CP866) плохо совмещаются с кодовыми страницами Windows и Unicode.

История кодировок здесь: О кодировках и кодовых страницах / Хабр (habr.com)

Исторически кодовой страницей Windows является CP1251 (Windows-1251, ANSI, Windows-Cyr), уверенно вытесняемая 8-битной кодировкой Юникода CP65001 (UTF-8, Unicode Transformation Format), в которой выполняется большинство современных приложений, особенно кроссплатформенных. Между тем, в целях совместимости с устаревшими файловыми системами, именно в консоли Windows сохраняет базовые кодировки DOS — CP437 (DOSLatinUS, OEM) и русифицированную CP866 (AltDOS, OEM).

Совет 1. Выполнять разработку текстовых файлов (программных кодов, текстовых данных и др.) исключительно в кодировке UTF-8. Мир любит Юникод, а кроссплатформенность без него вообще невозможна.

Совет 2. Периодически проверять кодировку, например в текстовом редакторе Notepad++. Visual Studio может сбивать кодировку, особенно при редактировании за пределами VS.

Поскольку в консоли постоянно происходит передача управления от приложений к собственно командному процессору и обратно, регулярно возникает «конфликт кодировок», наглядно иллюстрируемый таблица 1 и 2, сформированных следующим образом:

Были запущены три консоли — CMD, PS и WPS. В каждой консоли менялась кодовая страница с помощью команды CHCP, выполнялась команда Echo c двуязычной строкой в качестве параметра (табл. 1), а затем в консоли запускалось тестовое приложение, исходные файлы которого были созданы в кодировке UTF-8 (CP65001): первая строка формируется и направляется в поток главным модулем, вторая вызывается им же, формируется в подключаемой библиотеке классов и направляется в поток опять главным модулем, третья строка полностью формируется и направляется в поток подключаемой библиотекой.

Команды и код приложения под катом

команды консоли:

  • > Echo ffffff фффффф // в командной строке

  • PS> Echo ffffff фффффф // в PowerShell

  • PS> Echo ffffff ?????? // так выглядит та же команда в Windows PowerShell

код тестового приложения:

using System;
using ova.common.logging.LogConsole;
using Microsoft.Extensions.Logging;
using ova.common.logging.LogConsole.Colors;

namespace LoggingConsole.Test
{
    partial class Program
    {
        static void Main2(string[] args)
        {
            ColorLevels.ColorsDictionaryCreate();
            Console.WriteLine("Hello World! Привет, мир!");     //вывод строки приветствия на двух языках
            LogConsole.Write("Лог из стартового проекта", LogLevel.Information);
            Console.WriteLine($"8. Active codepage: input {Console.InputEncoding.CodePage}, output {Console.OutputEncoding.CodePage}");
            Console.ReadKey();
        } 
    }
}

Командную часть задания все консоли локализовали практически без сбоев во всех кодировках, за исключением: в WPS неверно отображена русскоязычная часть команды во всех кодировках.

Табл. 1. Результат выполнения команды консоли Echo ffffff фффффф

Табл. 1. Результат выполнения команды консоли Echo ffffff фффффф

Вывод тестового приложения локализован лишь в 50% испытаний, как показано в табл.2.

Табл. 2. Результат запуска приложения LoggingConsole.Test

Табл. 2. Результат запуска приложения LoggingConsole.Test

Сoвет 3. Про PowerShell забываем раз и навсегда. Ну может не навсегда, а до следующей мажорной версии…

По умолчанию Windows устанавливает для консоли кодовые страницы DOS. Чаще всего CP437, иногда CP866. Актуальные версии командной строки cmd.exe способны локализовать приложения на основе русифицированной кодовой страницы 866, но не 437, отсюда и изначальный конфликт кодировок консоли и приложения. Поэтому

Совет 4. Перед запуском приложения необходимо проверить кодовую страницу консоли командой CHCP и ей же изменить кодировку на совместимую — 866, 1251, 65001.

Совет 5. Можно установить кодовую страницу консоли по умолчанию. Кратко: в разделе реестра HKEY_LOCAL_MACHINESOFTWAREMicrosoftCommand Processor добавить или изменить значение параметра Autorun на: chcp <номер кодовой страницы>. Очень подробно здесь: Изменить кодовую страницу консоли Windows по умолчанию на UTF-8 (qastack.ru), оригинал на английском здесь: Change default code page of Windows console to UTF-8.

Проблемы консолей Visual Studio

В Visual Studio имеется возможность подключения консолей, по умолчанию подключены командная строка для разработчика и Windows PowerShell для разработчика. К достоинствам можно отнести возможности определения собственных параметров консоли, отдельных от общесистемных, а также запуск консоли непосредственно в директории разработки. В остальном — это обычные стандартные консоли Windows, включая, как показано ранее, установленную кодовую страницу по умолчанию.

Отдельной опцией Visual Studio является встроенная односеансная консоль отладки, которая перехватывает команду Visual Studio на запуск приложения, запускается сама, ожидает компиляцию приложения, запускает его и отдает ему управление. Таким образом, отладочная консоль в течение всего рабочего сеанса находится под управлением приложения и возможность использования команд Windows или самой консоли, включая команду CHCP, не предусмотрена. Более того, отладочная консоль не воспринимает кодовую страницу по умолчанию, определенную в реестре, и всегда запускается в кодировке 437 или 866.

Совет 6. Тестирование приложения целесообразно выполнять во внешних консолях, более дружелюбных к локализации.

Анализ проблем консолей был бы не полон без ответа на вопрос — можно ли запустить консольное приложение без консоли? Можно — любой файл «.exe» запустится двойным кликом, и даже откроется окно приложения. Однако консольное приложение, по крайней мере однопоточное, по двойному клику запустится, но консольный режим не поддержит — все консольные вводы-выводы будут проигнорированы, и приложение завершится

Локализация отладочной консоли Visual Studio

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

На самом деле, правильнее говорить о локализации приложения в консоли — это важное уточнение. Microsoft по этому поводу высказывается недвусмысленно: «Programs that you start after you assign a new code page use the new code page. However, programs (except Cmd.exe) that you started before assigning the new code page will continue to use the original code page». Иными словами, консоль можно локализовать когда угодно и как угодно, но приложение будет локализовано в момент стабилизации взаимодействия с консолью в соответствии с текущей локализацией консоли, и эта локализация сохранится до завершения работы приложения. В связи с этим возникает вопрос — в какой момент окончательно устанавливается связь консоли и приложения?

Важно! Приложение окончательно стабилизирует взаимодействие с консолью в момент начала ввода-вывода в консоль, благодаря чему и появляется возможность программного управления локализацией приложения в консоли — до первого оператора ввода-вывода.

Ниже приведен пример вывода тестового приложения в консоль, иллюстрирующий изложенное. Метод Write получает номера текущих страниц, устанавливает новые кодовые страницы вводного и выводного потоков, выполняет чтение с консоли и записывает выводную строку, содержащий русский текст, в том числе считанный с консоли, обратно в консоль. Операция повторяется несколько раз для всех основных кодовых страниц, упомянутых ранее.

F:LoggingConsole.TestbinReleasenet5.0>chcp
Active code page: 1251

F:LoggingConsole.TestbinReleasenet5.0>loggingconsole.test
Codepages: current 1251:1251, setted 437:437, ΓΓεΣΦ∞ 5 ±Φ∞ΓεδεΓ ∩ε-≡≤±±ΩΦ: Θ÷≤Ωσ=Θ÷≤Ωσ
Codepages: current 437:437, setted 65001:65001,  5  -: =
Codepages: current 65001:65001, setted 1252:1252, ââîäèì 5 ñèìâîëîâ ïî-ðóññêè: éöóêå=éöóêå
Codepages: current 1252:1252, setted 1251:1251, вводим 5 символов по-русски: йцуке=йцуке
Codepages: current 1251:1251, setted 866:866, ттюфшь 5 ёшьтюыют яю-Ёєёёъш: щЎєъх=щЎєъх
Codepages: current 866:866, setted 1251:1251, вводим 5 символов по-русски: йцуке=йцуке
Codepages: current 1251:1251, setted 1252:1252, ââîäèì 5 ñèìâîëîâ ïî-ðóññêè: éöóêå=éöóêå

F:LoggingConsole.TestbinReleasenet5.0>chcp
Active code page: 1252
  • приложение запущено в консоли с кодовыми страницами 1251 (строка 2);

  • приложение меняет кодовые страницы консоли (current, setted);

  • приложение остановлено в консоли с кодовыми страницами 1252 (строка 11, setted);

  • по окончании работы приложения изменения консоли сохраняются (строка 14 — Active codepage 1252);

  • Приложение адекватно локализовано только в случае совпадения текущих кодовых страниц консоли (setted 1251:1251) с начальными кодовыми страницами (строки 8 и 10).

Код тестового приложения под катом

using System;
using System.Runtime.InteropServices;

namespace LoggingConsole.Test
{
    partial class Program
    {
        [DllImport("kernel32.dll")] static extern uint GetConsoleCP();
        [DllImport("kernel32.dll")] static extern bool SetConsoleCP(uint pagenum);
        [DllImport("kernel32.dll")] static extern uint GetConsoleOutputCP();
        [DllImport("kernel32.dll")] static extern bool SetConsoleOutputCP(uint pagenum);
        
        static void Main(string[] args)
        {
            Write(437);
            Write(65001);
            Write(1252);
            Write(1251);
            Write(866);
            Write(1251);
            Write(1252);
         }

        static internal void Write(uint WantedIn, uint WantedOut)
        {
            uint CurrentIn = GetConsoleCP();
            uint CurrentOut = GetConsoleOutputCP();
            Console.Write($"current {CurrentIn}:{CurrentOut} - текущая кодировка, "); /*wanted {WantedIn}:{WantedOut},*/
            SetConsoleCP(WantedIn);
            SetConsoleOutputCP(WantedOut);
            Console.Write($"setted {GetConsoleCP()}:{GetConsoleOutputCP()} - новая кодировка, ");
            Console.Write($"вводим 3 символа по-русски: ");
            string str = "" + Console.ReadKey().KeyChar.ToString();
            str += Console.ReadKey().KeyChar.ToString();
            str += Console.ReadKey().KeyChar.ToString();
            Console.WriteLine($"={str}");
        }
      
        static internal void Write(uint ChangeTo)
        {
            Write(ChangeTo, ChangeTo);
        }
    }
}

Программное управление кодировками консоли — это единственный способ гарантированной адекватной локализацией приложения в консоли. Языки .Net такой возможности не предоставляют, однако предоставляют функции WinAPI: SetConsoleCP(uint numcp) и SetConsoleOutputCP(uint numcp), где numcp — номер кодовой страницы потоков ввода и вывода соответственно. Подробнее здесь: Console Functions — Windows Console | Microsoft Docs. Пример применения консольных функций WInAPI можно посмотреть в тестовом приложении под катом выше.

Совет 7. Обязательный и повторный! Функции SetConsoleCP должны размещаться в коде до первого оператора ввода-вывода в консоль.

Стратегия локализации приложения в консоли

  1. Удалить приложение PowerShell (если установлено), сохранив Windows PowerShell;

  2. Установить в качестве кодовую страницу консоли по умолчанию CP65001 (utf-8 Unicode) или CP1251 (Windows-1251-Cyr), см. совет 5;

  3. Разработку приложений выполнять в кодировке utf-8 Unicode;

  4. Контролировать кодировку файлов исходных кодов, текстовых файлов данных, например с помощью Notepad++;

  5. Реализовать программное управление локализацией приложения в консоли, пример ниже под катом:

Пример программной установки кодовой страницы и локализации приложения в консоли

using System;
using System.Runtime.InteropServices;

namespace LoggingConsole.Test
{
    partial class Program
    {
      	static void Main(string[] args)
        {
          	[DllImport("kernel32.dll")] static extern bool SetConsoleCP(uint pagenum);
        		[DllImport("kernel32.dll")] static extern bool SetConsoleOutputCP(uint pagenum);
            SetConsoleCP(65001);        //установка кодовой страницы utf-8 (Unicode) для вводного потока
            SetConsoleOutputCP(65001);  //установка кодовой страницы utf-8 (Unicode) для выводного потока
 
            Console.WriteLine($"Hello, World!");
        }
    }
}

Кракозябры в командной строке cmd. Проблемы с кодировкой cmd.exe

Выполняю cmd и в нем set, хочу узнать USERNAME. Но оно показывается в непонятной кодировке.

Оказывается надо в свойствах самого cmd выбрать шрифт Lucida Console. Только так можно получить нормальный текст на русском языке.

Спасшая статья:

Запустить командную строку можно следующим способом: Пуск → Выполнить → вводим в поле команду – cmd и жмем ОК. В итоге откроется рабочее окно программы – c:WINDOWSsystem32cmd.exe. ( рис.1)

42

Перейдем собственно к проблеме: иногда вместо русских букв при выполнении команд выходит набор непонятных символов ( рис.2).

41

Первым делом нужно зайти в свойства окна – правой кнопкой щелкнуть по верхней части окна → Свойства → выйдет окно рис.3, здесь в поле Шрифтвыбираем Lucida Console и жмем ОК.

43

Теперь Вы получили нормальный текст на русском языке. Так же можно поменять текущую кодировку шрифта, для этого используется команда chcp. Набираем эту команду и жмем Enter, в результате получим текущую кодировку для командной строки – рис.4.

44

Для изменения кодировки так же применим chcp в следующем формате:

Где – это цифровой параметр нужного шрифта, например,

1251 – Windows (кириллица);

Выбирайте на любой вкус. Т.о. что бы изменить кодировку на UTF-8 нужно выполнить команду chcp 65001.

almix 1350459937

almix
Разработчик Loco, автор статей по веб-разработке на Yii, CodeIgniter, MODx и прочих инструментах. Создатель Team Sense.

Источник

Как поменять язык в командной строке

Командная строка во всех ее ипостасях (консоль, терминал) предназначена для запуска исполняемых файлов и выполнения специальных задач. Эта программа запускается в качестве отдельного процесса, но в некоторых случаях она встраивается в другие приложения.

Как поменять язык в командной строке

Вам понадобится

  • Программное обеспечение:
  • — командная строка;
  • — терминал.

Инструкция

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

Для операционных систем семейства Windows основными являются два варианта сочетания клавиш: Ctrl+Shift и Alt+Shift. Вам достаточно выбрать один из предложенных вариантов, чтобы переключить раскладку в командной строке. Однако, существуют различные программы, которые могут дополнить функциональность вашей системы, например, Punto Switcher.

В некоторых случаях вы можете столкнуться с проблемой переключения языка в оконных приложениях. Для решения этой проблемы необходимо попеременно использовать левый Alt+Shift (английская раскладка) и правый Alt+Shift (русская раскладка). Также эти параметры можно изменить, открыв апплет «Язык и региональные стандарты».

Откройте меню «Пуск» и нажмите на «Панель управления». В появившемся окне дважды щелкните на значке «Язык и региональные стандарты». Перейдите к вкладке «Языки» и нажмите кнопку «Подробно». Затем нажмите кнопки «Параметры клавиатуры» и «Смена сочетаний клавиш».

В открывшемся окне «Дополнительные параметры клавиатуры» смените сочетание клавиш для всех раскладок, установленных в системе. Также вы можете для каждой раскладки задать свое сочетание, которое не используется другими программами. Выделите нужную строку, нажмите кнопку «Смена сочетаний». Поставьте галочку на пункте «Использовать…» и выберите нужные клавиши. Затем несколько раз нажмите кнопки «ОК».

Для операционных систем семейства Linux действует то же правило, но количество вариантов сочетаний клавиш значительно больше. Чтобы сменить клавиатурные сочетания, необходимо открыть меню «Система», выбрать пункты «Параметры» и «Клавиатура». В открывшемся окне нажмите кнопку «Параметры» и раскройте список «Клавиши для смены раскладки».

Источники:

  • как поменять столбцы строки

Войти на сайт

или

Забыли пароль?
Еще не зарегистрированы?

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

RRS feed

  • Remove From My Forums
  • Вопрос

  • Доброго времени суток коллеги.

    Есть windows server 2012 r2, в минимальной графической конфигурации, а так же в режиме ядра. На системы установлен и применен русский языковой пакет когда они были с GUI. Вопрос следующий как сменить язык обратно на английский,
    когда система в режиме core?

Ответы

  • Попробуйте

    Set-WinUILanguageOverride en-US

    • Помечено в качестве ответа
      Danish Alexander
      16 октября 2014 г. 10:24

Все ответы

  • Попробуйте

    Set-WinUILanguageOverride en-US

    • Помечено в качестве ответа
      Danish Alexander
      16 октября 2014 г. 10:24

  • Может в Powershell?

     Set-WinSystemLocale en-us

  • Попробуйте

    Set-WinUILanguageOverride en-US

    Да, спасибо, уже сам нашел.

    http://technet.microsoft.com/ru-ru/library/hh852142.aspx

  • Может в Powershell?

     Set-WinSystemLocale en-us

    Нет, это команда меняет язык системы по умолчанию, а не GUI.

I am writing a script that is responsible to read command output from Windows terminal.

The intent is to read the command line output using the command «sc query <service_name>» and based on regex, consume and resend a more concise data to the user.

The problem is that given the user language, the output content can change completely. I should not write a script that will interpret the «sc query» in all languages possible. Better to set a common language before running the script, so I can work on a single output format, no matter are the user language.

The first thing that comes when searching is the «chcp» command. But it does not works for me, and that are not much further when search for when the command does not works.

You can check in the print screen my trials to change the language (twice) and a sample for output service outputted in Portuguese.

Sample output of the trial on changing cmd language by chcp:

enter image description here

What I need to do? Is there some other way to change the cmd language or I need to do something else to make the chcp command to work?

I am writing a script that is responsible to read command output from Windows terminal.

The intent is to read the command line output using the command «sc query <service_name>» and based on regex, consume and resend a more concise data to the user.

The problem is that given the user language, the output content can change completely. I should not write a script that will interpret the «sc query» in all languages possible. Better to set a common language before running the script, so I can work on a single output format, no matter are the user language.

The first thing that comes when searching is the «chcp» command. But it does not works for me, and that are not much further when search for when the command does not works.

You can check in the print screen my trials to change the language (twice) and a sample for output service outputted in Portuguese.

Sample output of the trial on changing cmd language by chcp:

enter image description here

What I need to do? Is there some other way to change the cmd language or I need to do something else to make the chcp command to work?

25 / 25 / 15

Регистрация: 17.02.2014

Сообщений: 310

1

Изменить язык вывода командной строки

03.05.2014, 01:42. Показов 50532. Ответов 6


1) как установить русский язык в командной строке, когда я включаю командную строку у меня пишет по-русски (с) Корпорация Майкрософт и так далее, а когда вожу команду «HELP», то на английском языке появляются объяснения
2) как изменить время в командной строке пишу команду «time» появляется сообщение «Enter the new time» я ввожу 12:00:00,00 не помогает 12:00 тоже не работает

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



1146 / 954 / 76

Регистрация: 11.10.2010

Сообщений: 6,031

03.05.2014, 10:17

2

Пуск->Панель управления ->Язык и региональные стандарты ->Вкладка Языки и Подробнее ->Вкладка Параметры
так делалось?



1



Persk

Модератор

Эксперт Windows

8364 / 3329 / 241

Регистрация: 25.10.2010

Сообщений: 13,536

03.05.2014, 14:25

3

Цитата
Сообщение от user-men
Посмотреть сообщение

как изменить время в командной строке пишу команду «time» появляется сообщение «Enter the new time» я ввожу 12:00:00,00 не помогает 12:00 тоже не работает

Bash
1
time /?
Bash
1
time /T



1



25 / 25 / 15

Регистрация: 17.02.2014

Сообщений: 310

03.05.2014, 15:06

 [ТС]

4

Цитата
Сообщение от Persk
Посмотреть сообщение

Код Bash
1
time /?
Код Bash
1
time /T

что-то я ничего не понял если мне нужно изменить время на 12:00 то как это сделает



0



3455 / 1993 / 635

Регистрация: 26.02.2014

Сообщений: 1,457

03.05.2014, 15:21

5

Лучший ответ Сообщение было отмечено user-men как решение

Решение

Если после попытки изменения времени появляется сообщение «A required privilege is not held by the client.», то командную строку надо перезапусить от имени администратора.



1



Эксперт WindowsАвтор FAQ

17954 / 7591 / 889

Регистрация: 25.12.2011

Сообщений: 11,323

Записей в блоге: 17

03.05.2014, 21:30

6

user-men,
1. Описания к командам появляются на английском языке?
Введите в консоль команду

Напишите в теме, что ответит команда.
Введите последовательно:

Напишите, появились ли изменения.

2. Запуск скрипта с повышенными привилегиями [руководство]



1



31 / 40 / 6

Регистрация: 04.10.2014

Сообщений: 185

27.07.2021, 14:25

7

Есть еще один обходной путь, если нужен английский при выводе информации — перевести консоль в UTF-8
chcp 65001

для проверки
help



0



Понравилась статья? Поделить с друзьями:
  • Как поменять шрифт папок в windows 10
  • Как поменять язык интерфейса в windows 10 home на английский
  • Как поменять шрифт на ноутбуке windows 11
  • Как поменять язык интерфейса windows server 2019
  • Как поменять шрифт на компьютере windows клавишами