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

11

我需要指定正确的编码格式来使用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,这不是我需要的。

谢谢,

Alex

更新1: 显然,在cmd.exe中执行“mode”并解析输出应该可以解决问题,但这似乎太粗鲁了。我正在寻找.NET解决方案。

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

3个回答

18

控制台模式应用程序的 默认 代码页是由系统区域设置确定的。 控制面板+地区和语言,管理选项卡,更改系统区域设置。 您的Windows代码页是Cyrillic,因此您的控制台代码页也是Cyrillic,所以此代码可能有效:

        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程序,有很多.NET zip库可用。


2
您需要使用 Encoding.CodePage 属性:
var codePage = Console.OutputEncoding.CodePage;

这将为您提供一个代码页值(在您的示例中为866)。


MessageBox.Show(Console.OutputEncoding.CodePage.ToString()) -> 1251。顺便说一句,这是Windows窗体应用程序,而不是控制台应用程序。 - Alex Netkachov

1

对我来说 852 (Latin II):

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接