【问题标题】:How to find OS code page number in .NET Core?如何在 .NET Core 中查找操作系统代码页码?
【发布时间】:2020-04-14 15:16:02
【问题描述】:

我需要在 .NET Core 应用程序中获取 Windows 默认代码页。 IE。英语系统为 1252,西里尔系统为 1251,希腊语系统为 1253,等等。以前在 .NET Framework 4 和 Mono 中,可以通过 Encoding.Default 轻松完成。程序迁移到 .NET Core 3.1 后,现在需要在每台 PC 上手动设置代码页号。这对某些用户来说并不容易。

如何返回旧(系统)代码页的自动检测?无法读取 Windows 注册表来检测系统设置,因为该应用程序还应该在 Linux 上运行,并使用从 Windows PC 接收(或发送到该 PC)的外部数据。

其他使用 ANSI 代码页进行数据输入和输出的软件无法重写。

可能 OEM 代码页也很有趣(用于与控制台软件的无缝交互,仍然使用 DOS 代码页)。

【问题讨论】:

  • 您的应用是否仅在 Windows 上运行? windows 代码页只在非 nt windows 上有意义...听起来像一个 x-y 问题。
  • 只有现代软件使用 UTF-8。)旧的和不受支持的仍然在其操作系统上使用的旧代码页中导出和导入数据。感谢 Hans Passant 指导回答。

标签: c# text .net-core codepages


【解决方案1】:

第一个是 .NET Framework 代码,第二个是它的 .NET Core 等效代码:

//OutputEncoding = Encoding.Default;
OutputEncoding = CodePagesEncodingProvider.Instance.GetEncoding(System.Globalization.CultureInfo.CurrentCulture.TextInfo.ANSICodePage);

很长,但在 Windows 和 Linux 上都能正常运行。

DOS、EBCDIC 和 MacOS 编码可以通过CurrentCulture.TextInfo.*CodePage 类似地获得。

【讨论】:

    【解决方案2】:

    我不同意 Alexander Tauenis 的回答。

    System.Globalization.CultureInfo.CurrentCulture.TextInfo.ANSICodePage 仍将返回旧的 ANSI 代码页编号,即使用户启用了“测试版:使用 Unicode UTF-8 支持全球语言”选项。在这种情况下,Encoding.DefaultCodePagesEncodingProvider.Instance.GetEncoding(System.Globalization.CultureInfo.CurrentCulture.TextInfo.ANSICodePage) 的行为是不同的。

    在 .NET 中找到正确的代码页号并不容易。这是一个正确的方法(但不幸的是它调用了Win32API)

    在文件NativeMethods.cs

    public partial class NativeMethods {
        
        /// Return Type: UINT->unsigned int
        [System.Runtime.InteropServices.DllImportAttribute("kernel32.dll", EntryPoint="GetACP")]
    public static extern  uint GetACP() ;
    
    }
    

    并获取代码页码:

    var codepage = NativeMethods.GetACP()
    

    【讨论】:

      猜你喜欢
      • 2017-01-26
      • 2011-06-10
      • 2020-08-01
      • 2016-12-11
      • 2019-09-26
      • 1970-01-01
      • 2012-10-30
      • 1970-01-01
      • 2022-10-15
      相关资源
      最近更新 更多