【问题标题】:How to get CMD/console encoding in C#如何在 C# 中获取 CMD/控制台编码
【发布时间】:2011-08-20 02:45:30
【问题描述】:

我需要指定正确的代码页以使用 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: 显然,在 cmd.exe 中执行“模式”并解析输出应该可以工作,但似乎太粗鲁了。我正在寻找 .NET 解决方案。

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

【问题讨论】:

    标签: c# console cmd


    【解决方案1】:

    你需要Encoding.CodePage属性:

    var codePage = Console.OutputEncoding.CodePage;
    

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

    【讨论】:

    • MessageBox.Show(Console.OutputEncoding.CodePage.ToString()) -> 1251。顺便说一句,这是 Windows 窗体应用程序,而不是控制台应用程序。
    【解决方案2】:

    控制台模式应用程序的默认代码页由系统区域设置决定。控制面板 + 区域和语言,管理选项卡,更改系统区域设置。您的 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 程序,有很多可用的 .NET zip 库。

    【讨论】:

      【解决方案3】:

      对我来说 852(拉丁语 II):

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

      【讨论】:

        猜你喜欢
        • 2015-08-17
        • 2011-04-23
        • 2018-12-16
        • 1970-01-01
        • 1970-01-01
        • 2017-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多