You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Core 2.2升级至3.1后Ubuntu系统区域性检测异常

.NET Core 3.1 默认区域性异常问题排查与解决

问题背景

将ASP.NET Core应用从2.2版本升级到3.1后,数字格式出现异常:货币符号从$变为¤,字符串比较逻辑也发生变化。测试发现应用的默认区域性从English (United States, Computer)变成了空值。

系统locale命令输出如下:

$ locale
LANG=C.UTF-8
LANGUAGE=
LC_CTYPE="C.UTF-8"
LC_NUMERIC="C.UTF-8"
LC_TIME="C.UTF-8"
LC_COLLATE="C.UTF-8"
LC_MONETARY="C.UTF-8"
LC_MESSAGES="C.UTF-8"
LC_PAPER="C.UTF-8"
LC_NAME="C.UTF-8"
LC_ADDRESS="C.UTF-8"
LC_TELEPHONE="C.UTF-8"
LC_MEASUREMENT="C.UTF-8"
LC_IDENTIFICATION="C.UTF-8"
LC_ALL=

运行测试代码:

static void Main(string[] args) {
    Console.WriteLine($"CurrentCulture   = {CultureInfo.CurrentCulture.Name}");
    Console.WriteLine($"CurrentUICulture = {CultureInfo.CurrentUICulture.Name}");
    Console.WriteLine($"{RegionInfo.CurrentRegion}");
}

得到输出:

CurrentCulture   =
CurrentUICulture =
IV

一、.NET 默认区域性的判定逻辑

未显式设置区域性时,.NET按以下优先级确定默认值:

  • 进程级环境变量:优先读取DOTNET_CULTURE和DOTNET_UICULTURE环境变量;
  • 系统区域设置:若上述变量未设置,读取操作系统的LC_*或LANG环境变量;
  • 回退机制:如果系统区域设置无法识别(比如C.UTF-8这类中性编码设置),.NET会回退到空区域性(InvariantCulture变体),这就是货币符号变成¤、区域性为空的原因——¤是不变区域性的默认货币符号。

你的系统LANG设为C.UTF-8,这是不关联特定区域的字符编码配置,.NET无法映射到具体区域性(如en-US),因此触发了回退逻辑。

二、无需代码修改恢复原区域性的方法

1. 设置进程级环境变量

在应用启动前指定目标区域性:

# 当前终端会话临时生效
export DOTNET_CULTURE=en-US
export DOTNET_UICULTURE=en-US

# 永久生效(写入~/.bashrc、~/.zshrc等配置文件)
echo 'export DOTNET_CULTURE=en-US' >> ~/.bashrc
echo 'export DOTNET_UICULTURE=en-US' >> ~/.bashrc
source ~/.bashrc

2. 调整系统区域设置

将系统LANG或LC_ALL改为具体区域性值(以en_US.UTF-8为例):

# 临时生效
export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8

# 永久生效(Debian/Ubuntu系统示例)
sudo update-locale LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8

修改后重启系统或重新登录,使设置生效。

3. 应用配置文件指定

在appsettings.json中添加区域性配置:

{
  "Globalization": {
    "Culture": "en-US",
    "UICulture": "en-US"
  }
}

在Program.cs中读取配置并应用(属于配置层面调整,非硬编码):

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseStartup<Startup>();
        })
        .ConfigureServices((context, services) =>
        {
            var globalizationConfig = context.Configuration.GetSection("Globalization");
            var culture = globalizationConfig["Culture"];
            var uiCulture = globalizationConfig["UICulture"];
            if (!string.IsNullOrEmpty(culture) && !string.IsNullOrEmpty(uiCulture))
            {
                CultureInfo.DefaultThreadCurrentCulture = new CultureInfo(culture);
                CultureInfo.DefaultThreadCurrentUICulture = new CultureInfo(uiCulture);
            }
        });

内容的提问来源于stack exchange,提问作者Ryan Griffith

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 07:45:19