如何在 .NET Core 中查找 OS 代码页码?
How to find OS code page number in .NET Core?
我需要在 .NET Core 应用程序中获取 Windows 默认代码页。 IE。在英语系统上为 1252,在西里尔系统上为 1251,在希腊语系统上为 1253,等等。以前在 .NET Framework 4 和 Mono 中,可以通过 Encoding.Default 轻松完成。程序迁移到.NET Core 3.1后,现在需要在每台PC上手动设置代码页码。这对一些用户来说并不容易。
如何return自动检测遗留(系统)代码页?无法读取 Windows 注册表来检测系统设置,因为该应用程序还应该 运行 在 Linux 上使用从 Windows PC 接收的外部数据(或发送到该) .
其他使用ANSI代码页进行数据输入输出的软件无法改写
可能 OEM 代码页也很有趣(为了与控制台软件无缝交互,它甚至仍然使用 DOS 代码页)。
第一个是 .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
类似地获得。
我不同意 Alexander Tauenis 的回答。
System.Globalization.CultureInfo.CurrentCulture.TextInfo.ANSICodePage
仍将 return 旧的 ANSI 代码页编号,即使用户启用了选项“Beta:使用 Unicode UTF-8 以获得全球语言支持”。在这种情况下,Encoding.Default
和 CodePagesEncodingProvider.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()
我需要在 .NET Core 应用程序中获取 Windows 默认代码页。 IE。在英语系统上为 1252,在西里尔系统上为 1251,在希腊语系统上为 1253,等等。以前在 .NET Framework 4 和 Mono 中,可以通过 Encoding.Default 轻松完成。程序迁移到.NET Core 3.1后,现在需要在每台PC上手动设置代码页码。这对一些用户来说并不容易。
如何return自动检测遗留(系统)代码页?无法读取 Windows 注册表来检测系统设置,因为该应用程序还应该 运行 在 Linux 上使用从 Windows PC 接收的外部数据(或发送到该) .
其他使用ANSI代码页进行数据输入输出的软件无法改写
可能 OEM 代码页也很有趣(为了与控制台软件无缝交互,它甚至仍然使用 DOS 代码页)。
第一个是 .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
类似地获得。
我不同意 Alexander Tauenis 的回答。
System.Globalization.CultureInfo.CurrentCulture.TextInfo.ANSICodePage
仍将 return 旧的 ANSI 代码页编号,即使用户启用了选项“Beta:使用 Unicode UTF-8 以获得全球语言支持”。在这种情况下,Encoding.Default
和 CodePagesEncodingProvider.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()