为什么我能创建一个名为“en-UN”的语言环境,但它其实并不存在?
在开发者的机器上能用,但在某些服务器上却不行(至少在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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。