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

为何可创建不存在的en-UN CultureInfo?Server 2012 R2运行异常

问题解释:en-UN CultureInfo可手动创建但无法通过GetCultures找到的原因

核心原因

en-UN是Windows的补充文化(Supplemental Culture),这类文化不属于.NET CultureInfo.GetCultures()枚举覆盖的标准文化集合,但Windows的NLS(国家语言支持)内核能够识别并解析其名称,因此可以通过构造函数创建实例,却不会出现在任何CultureTypes的查询结果中。

详细分析

  • 补充文化的特性:Windows为满足小众区域、组织的文化需求,提供了补充文化库。这些文化并非系统默认预装的核心文化,因此不会被GetCultures()返回——该方法仅返回.NET框架/Windows系统标记为"标准预装"的文化集合。
  • CultureInfo构造函数的行为:当你调用new CultureInfo("en-UN", false)时,第二个参数useUserOverride设为false,会直接调用底层Windows NLS API解析文化名称。只要NLS能识别该名称,就能成功创建有效的CultureInfo实例,无需该文化存在于GetCultures()的结果集中。
  • Server 2012 R2的兼容性问题:不同Windows版本的NLS支持的补充文化列表存在差异。Server 2012 R2的NLS组件可能未包含en-UN的定义,导致在该系统上无法创建该CultureInfo,而你的开发机器(如Win10/Win11或更高版本服务器)的NLS支持此补充文化,因此可以正常运行。

验证你的测试结果

你的代码运行结果完全符合上述逻辑:

  • 手动创建成功:当前系统NLS能识别en-UN,返回了正确的显示名"English (United Nations)"。
  • 遍历所有CultureTypes均无法找到:因为补充文化不在NeutralCultures、SpecificCultures、AllCultures等任何枚举类型覆盖的范围内。

测试代码

System.Globalization.CultureInfo? test = new("en-UN", false);
string resultString = "Manually created: " + (test?.DisplayName ?? "NULL") + "\r\n";

foreach (CultureTypes cultureType in Enum.GetValues<CultureTypes>())
{
    test = System.Globalization.CultureInfo.GetCultures(cultureType).Where(x => x.Name == "en-UN").FirstOrDefault();
    resultString += "Found in " + cultureType.ToString() + ": " + (test?.DisplayName ?? "NULL") + "\r\n";
}

运行结果

Manually created: English (United Nations)

Found in NeutralCultures: NULL

Found in SpecificCultures: NULL

Found in InstalledWin32Cultures: NULL

Found in AllCultures: NULL

Found in UserCustomCulture: NULL

Found in ReplacementCultures: NULL

Found in WindowsOnlyCultures: NULL

Found in FrameworkCultures: NULL

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.01 17:07:26