Как получить CMD/консольную кодировку в С#

Мне нужно указать правильную кодовую страницу, чтобы упаковать файлы в zip-библиотеку. Как я вижу, мне нужно указать консольную кодировку (866 в моем случае).

 C:\Users\User>mode

 Status for device CON:
 ----------------------
     Lines:          300
     Columns:        130
     Keyboard rate:  31
     Keyboard delay: 1
     Code page:      866 <- I need to get this value in C# code

Console.OutputEncoding возвращает 1251, это не то, что мне нужно.

Спасибо,

Алекс

Обновление 1: Очевидно, что выполнение "mode" в cmd.exe и синтаксическом анализе должно работать, но кажется слишком грубым. Я ищу .NET-решение.

Обновление 2: Приложение представляет собой приложение Windows Forms, а не консольное приложение.

Ответ 1

Кодовая страница по умолчанию для приложения режима консоли определяется по языку системы. Панель управления + Область и язык, вкладка "Администрирование", "Изменить системный язык". Ваша кодовая страница Windows является кириллицей, поэтому ваша кодовая страница консоли имеет разумный шанс, что этот код будет работать:

        int lcid = GetSystemDefaultLCID();
        var ci = System.Globalization.CultureInfo.GetCultureInfo(lcid);
        var page = ci.TextInfo.OEMCodePage;
        // etc..

    [System.Runtime.InteropServices.DllImport("kernel32.dll")]
    public static extern int GetSystemDefaultLCID();

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

Ответ 2

Вам нужно Encoding.CodePage свойство:

var codePage = Console.OutputEncoding.CodePage;

который даст вам значение кодовой страницы (866 в вашем примере).

Ответ 3

для меня 852 (лат. II):

Encoding consoleEncoding = Encoding.GetEncoding(CultureInfo.CurrentCulture.TextInfo.OEMCodePage);