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

发布于 2024-11-05 18:45:53 字数 557 浏览 0 评论 0原文

我需要指定正确的代码页来使用 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 窗体应用程序,而不是控制台应用程序。

I need to specify the correct codepage to pack the files with zip library. As I see, I need to specify console encoding (866 in my case).

 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 returns 1251, which is not what I need.

Thanks,

Alex

Update 1: Obviously, execute "mode" in cmd.exe and parse output should work but it seems too rude. I'm looking for .NET solution.

Update 2: The application is windows forms application, not a console app.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

身边 2024-11-12 18:45:53

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

The default code page for a console mode app is determined by the system locale. Control Panel + Region and Language, Administrative tab, Change System Locale. Your Windows code page is Cyrillic, so is your console code page so there's a reasonable chance that this code will work:

        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();

Do avoid writing code like this, 8-bit text encodings are a mine field. There certainly isn't any decent reason to have to run a console-mode zip program, there are plenty of .NET zip libraries available.

抠脚大汉 2024-11-12 18:45:53

您需要 Encoding.CodePage< /a> 属性:

var codePage = Console.OutputEncoding.CodePage;

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

You need Encoding.CodePage property:

var codePage = Console.OutputEncoding.CodePage;

which will give you a code page value (866 in your example).

独夜无伴 2024-11-12 18:45:53

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

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

for me 852 (Latin II):

Encoding consoleEncoding = Encoding.GetEncoding(CultureInfo.CurrentCulture.TextInfo.OEMCodePage);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文