CultureInfo.GetCultures(AllCultures)为何缺失部分有效区域性?
问题背景
运行环境为Windows 10、.NET Framework 4.6.1时存在如下现象:可成功创建sr-Cyrl-CS、sr-Latn-CS两个有效的CultureInfo实例,但这两个实例对应的区域性名称不会出现在CultureInfo.GetCultures(CultureTypes.AllCultures)的返回结果集中,对应集合成员判断返回值均为false。
使用的测试代码如下:
var allCultureNamesHashSet = new HashSet<string>(CultureInfo.GetCultures(CultureTypes.AllCultures).Select(ci => ci.Name)); var ci1 = new CultureInfo("sr-Cyrl-CS"); var ci2 = new CultureInfo("sr-Latn-CS"); var b1 = allCultureNamesHashSet.Contains(ci1.Name); //false var b2 = allCultureNamesHashSet.Contains(ci2.Name); //false
问题根因
- 两个名称属于已废弃的非标准区域性别名
2006年塞尔维亚和黑山解体后,原ISO 3166分配给塞尔维亚和黑山的国家代码CS正式作废,后续标准区域性名称统一使用代表塞尔维亚的RS、代表黑山的ME作为国家后缀,对应正式有效的塞尔维亚相关区域性为sr-Cyrl-RS、sr-Latn-RS、sr-Cyrl-ME、sr-Latn-ME,sr-Cyrl-CS、sr-Latn-CS属于遗留旧名称,不再是当前生效的标准区域性标识。 CultureInfo实例创建与全量枚举的逻辑规则不一致
为了兼容旧版本程序,.NET Framework在CultureInfo构造函数中内置了旧名称映射逻辑:传入已废弃的sr-Cyrl-CS、sr-Latn-CS名称时不会抛出异常,会自动映射到当前有效的塞尔维亚对应区域性,返回可用实例;但CultureInfo.GetCultures(CultureTypes.AllCultures)接口的逻辑是枚举当前版本.NET和操作系统正式注册、对外公开的有效标准区域性,这类仅做向下兼容的旧别名不会被纳入枚举范围。- Windows 10系统本身已过滤废弃区域性
Windows 10的系统区域性列表中已经移除了所有带CS后缀的废弃塞尔维亚区域性,.NET调用系统原生接口枚举全量区域性时,本身就无法获取到这两个旧名称对应的条目。
内容的提问来源于stack exchange,提问作者tjsmith
相关产品推荐
相关产品推荐

