如何在C#中获取CMD /控制台编码

Ale*_*hov 10 c# console 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
Run Code Online (Sandbox Code Playgroud)

Console.OutputEncoding返回1251,这不是我需要的.

谢谢,

亚历克斯

更新1:显然,在cmd.exe中执行"mode"并解析输出应该有效但看起来太粗鲁了.我正在寻找.NET解决方案.

更新2:应用程序是Windows窗体应用程序,而不是控制台应用程序.

Han*_*ant 18

控制台模式应用程序的默认代码页由系统区域设置决定.控制面板+区域和语言,管理选项卡,更改系统区域设置.您的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();
Run Code Online (Sandbox Code Playgroud)

避免编写这样的代码,8位文本编码是一个雷区.当然没有任何合理的理由来运行控制台模式的zip程序,有很多.NET zip库可用.