如何设置.NET应用程序的默认编码?
我在两个不同的环境中运行应用程序时遇到问题:本地和docker容器内部。 问题在于,应用程序中使用了如何设置.NET应用程序的默认编码?,.net,docker,encoding,.net,Docker,Encoding,我在两个不同的环境中运行应用程序时遇到问题:本地和docker容器内部。 问题在于,应用程序中使用了编码.Default编码。本地计算机上的默认值返回cp1252,在docker容器中返回utf-8 我知道,使用编码是一种非常糟糕的做法。默认值为,将来会被修复,但我现在无权更改。我现在要做的就是在docker中以当前状态正确运行应用程序 据我所知,Encoding.Default返回系统区域设置,所以我需要将docker映像的系统区域设置更改为使用cp1252的内容。但是我没有找到方法,怎么做
编码.Default
<代码>编码。本地计算机上的默认值返回cp1252,在docker容器中返回utf-8
我知道,使用编码是一种非常糟糕的做法。默认值为,将来会被修复,但我现在无权更改。我现在要做的就是在docker中以当前状态正确运行应用程序
据我所知,Encoding.Default
返回系统区域设置,所以我需要将docker映像的系统区域设置更改为使用cp1252的内容。但是我没有找到方法,怎么做
在运行应用程序之前,我使用了chcp
命令-编码。默认值仍然返回utf-8。
我已经尝试在powershell中设置WinSystemLocale-SystemLocale en-us
,但仍然将utf-8作为默认编码
该应用程序是.NET Framework 4.7控制台应用程序。docker映像是,我想它是基于WindowsServer2019的
如何在cmd/powershell中更改it的系统设置以强制编码。默认值返回cp1252而不是utf-8
编辑:
Encoding.Default
使用GetACP()windows本机函数,在docker容器中它总是返回65001。chcp命令没有帮助:
PS C:\> $Signature = @"
>> [DllImport("kernel32.dll")] public static extern int GetACP();
>> "@
PS C:\> $acpGetter = Add-Type -MemberDefinition $Signature -Name "Win32ShowWindowAsync" -Namespace Win32Functions -PassThru
PS C:\> $acpGetter::GetACP()
65001
PS C:\> chcp 1252
Active code page: 1252
PS C:\> $acpGetter::GetACP()
65001
只是为了增加你的痛苦(这就是你想要的,对吧?):在.NETCore中(不确定每个版本是否重要),编码。默认值总是UTF-8;没有帮助,但可能需要了解;我认为.NETFramework总是返回一个代码页,所以;如果看到UTF8,您确定没有测试.NETCore吗?如果我在本地(windows)尝试NET47或NET48,我会看到iso-8859-1,而不是UTF8(如果我切换到.NET Core:UTF8),是的,我知道.NET Core在这方面的行为。该应用程序明确针对.NET Framework 4.7.2。因此,检查IL时,NETFX将返回UTF8,如果(且仅当)GetACP
返回65001;那么,您可能需要将系统语言环境设置为65001—也许可以使用它在某处进行测试,看看它设置为什么值,即set WinSystemLocale
?但是:也有一些事情表明这不会有好的结果:我已经检查过了,GetACP()在我的例子中总是返回65001。嗯,我无法回答潜在的问题,但是:至少,我们在理解场景方面又前进了一步!