为啥不是所有国家都出现在 CultureInfo.GetCultures() 中?

Posted

技术标签:

【中文标题】为啥不是所有国家都出现在 CultureInfo.GetCultures() 中?【英文标题】:Why not all countries are presented in CultureInfo.GetCultures()?为什么不是所有国家都出现在 CultureInfo.GetCultures() 中? 【发布时间】:2011-03-09 13:00:33 【问题描述】:

我正在使用此标准代码来填充国家/地区列表:

static void Main(string[] args)

    List cultureList = new List();

    CultureInfo[] cultures = CultureInfo.GetCultures(CultureTypes.AllCultures & ~CultureTypes.NeutralCultures);

    foreach (CultureInfo culture in cultures)
    
        try
        
            RegionInfo region = new RegionInfo(culture.LCID);

            if (!(cultureList.Contains(region.EnglishName)))
            
                cultureList.Add(region.EnglishName);
                Console.WriteLine(region.EnglishName);
            
        
        catch (ArgumentException ex) 
        
            // just ignore this
            continue;
        
    

我看到有些国家错过了。只是想知道这种情况的原因是什么?

【问题讨论】:

sashaeve,一个具体的例子会很好。 IIRC 它也取决于 Windows 版本/版本。 @Henk Holterman:我没有找到加纳、科特迪瓦、喀麦隆和其他一些国家。 [在尝试时缺少来自 CultureInfo 的国家和地点](***.com/questions/2920274/…) 直到 vista 发布之前,格陵兰岛也不在其中! :) 【参考方案1】:

你没有得到所有的文化:

CultureTypes.AllCultures & ~CultureTypes.NeutralCultures

【讨论】:

Oded,在问题的上下文中你错了。中立文化不代表一个国家,而只是一种语言,而且它们的使用非常有限(主要用于本地化资源或从中获取特定文化)。 @Lucero - 他正在对NeutralCultures 进行按位补码。 这是正确的,因为他确实想要结果中的中性文化:Console.WriteLine(CultureTypes.AllCultures & ~CultureTypes.NeutralCultures); 返回SpecificCultures, InstalledWin32Cultures,其中应包括所有特定文化(例如,具有国家/地区的文化)。 【参考方案2】:

我会使用 CultureTypes.SpecificCultures,但它不能回答您的问题。

为什么世界上只有一部分国家?好吧,他们有很多。必须有人维护它们,而且确实要花钱。我认为这就是为什么微软决定只支持最“流行”的。

顺便说一句。您可以创建自己的 CultureInfo。另外,我还没有尝试过,但是您可以通过在构造函数中传递其 ISO 代码来创建 RegionInfo 实例。不过,我不确定如果没有匹配的 CultureInfo 会发生什么。

【讨论】:

【参考方案3】:

答案是:设计

CultureInfo.GetCultures 并非旨在成为世界上所有文化的完整和权威列表。它旨在让您了解可以在计算机上找到的文化。

CultureInfo documentation 说:

请记住,文化名称和标识符仅代表一个 可以在特定计算机上找到的文化子集。视窗 版本或服务包可以更改可用的文化。 应用程序使用 CultureAndRegionInfoBuilder 添加自定义文化 班级。用户使用 Microsoft 区域设置添加自己的自定义文化 生成器工具。 Microsoft Locale Builder 是用托管代码编写的 使用 CultureAndRegionInfoBuilder 类。


注意事项

MSDN 上可能有用的链接:

预定义 RegionInfo 列表:http://msdn.microsoft.com/en-us/library/system.globalization.regioninfo(VS.80).aspx 如何创建自定义文化:http://msdn.microsoft.com/en-us/library/ms172469(VS.80).aspx

顺便说一句,你可以用一个简单的 LINQ '命令'来缩短你的代码:

var regionInfos = CultureInfo.GetCultures(CultureTypes.SpecificCultures)
  .Select(c => new RegionInfo(c.LCID))
  .Distinct()
  .ToList();

【讨论】:

以上是关于为啥不是所有国家都出现在 CultureInfo.GetCultures() 中?的主要内容,如果未能解决你的问题,请参考以下文章

获取一个国家的默认时区(通过 CultureInfo)

为国家、语言组合创建自定义 CultureInfo

如何从 CultureInfo 获取没有国家/地区的语言

如何从 .NET 中的 CultureInfo 获取 ISO 3166 国家代码

CultureInfo.NumberFormat 隐藏逗号

新 CultureInfo(string Name) 构造函数 - .NET (C#)