为什么我能创建一个名为“en-UN”的语言环境,但它其实并不存在?

后端开发 2026-07-10

在开发者的机器上能用,但在某些服务器上却不行(至少在Server 2012 R2上不是这样),因此我一直想弄清楚是什么、为什么会这样。

于是我尝试手动创建一个带有“en-UN”的CultureInfo,它可以工作,并且显示名称为“English (United nations)”,因此我猜它在我的机器某处存在。

但当我在所有CultureInfo中查找时,它却不在那里?

我不理解这个CultureInfo是从哪里来的,因为它并不属于CultureTypes.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

解决方案

“The en-UN” 实际上在你的机器上并不存在,它应该是一个自定义文化,你可以检查 test.CultureTypes 标志。

这是由于NLS与 ICU之间的差异,以及Windows操作系统版本的差异。简而言之,在Windows的早期版本中使用NLS API创建一个不存在的 CultureInfo 会导致 CultureNotFoundException

在.NET 5及之后的应用应该默认使用ICU API,但Windows Server 2012没有内置的ICU库,因此会回退到使用NLS。你可以尝试安装 Microsoft.ICU.ICU4C.Runtime 包。

或者如果你想在最新的.NET应用中只允许创建已安装的文化,可以开启 PredefinedCulturesOnly 开关。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章