.NET CultureInfo的ru和ru-RU有什么不同?

4
我在CultureInfo类中发现了一件有趣的事情。我正在ASP.NET应用程序中编写代码,并使用Thread.CurrentThread.CurrentCulture获取当前选定的语言:
Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo(alias);

有两个地方可以设置当前线程的语言环境,我在其中一个地方进行了以下操作:
  1. Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("ru");

  2. Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("ru-RU");

然后我突然发现,语言环境(1)与语言环境(2)不同,但它们都是俄语。
我是做错了什么还是Microsoft出了问题? 编辑 @Tim Schmelter
        var culture = CultureInfo.GetCultureInfo("ru");
        var culture2 = CultureInfo.GetCultureInfo("ru-RU");
        if (Equals(culture, culture2))
        {
            Console.Write(true);
            return;
        }
        Console.Write(false);

问题是 - "为什么微软将"ru"和"ru-RU"分开?"

1
难道 ru 和 ru-Ru 都不是俄语区域名称吗? - Regon
2
“is different” 以什么方式不同?@Maris:不要大声喊叫!此外,Sriram 没有必要冒犯。 - Tim Schmelter
1
@SriramSakthivel:我知道。但是“微软醉了”只是对一个无感情的机构的简短批评。称呼某些人为酒鬼是一种冒犯。 - Tim Schmelter
1
同意Tim的观点,@Maris,如果我冒犯了你,请原谅。我们在这里是为了帮助大家。就当什么都没发生,让我们来看看问题吧 :) - Sriram Sakthivel
2
请记住,许多语言在不止一个地区或国家使用。例如俄语在许多国家,如哈萨克斯坦或拉脱维亚中被一些少数民族使用,因此在未来.NET可能会包括ru-KZru-LV等文化,除了ru-RU。已经有像西班牙语这样的语言有许多CultureInfo(大约20个),包括es-ES(西班牙语(西班牙))、es-AR(西班牙语(阿根廷))、es-US(西班牙语(美国))。 - Jeppe Stig Nielsen
显示剩余8条评论
2个回答

11
那是因为CultureInfo.GetCultureInfo("ru")返回NeutralCulture,而CultureInfo.GetCultureInfo("ru-RU")返回SpecificCulture。 实际上,SpecificCulture派生自NeutralCulture。所以答案是否定的,它们不同且具有不同的LCID。
通常情况下,您应始终使用SpecificCulture。
关于CultureInfo,建议阅读这篇MSDN文章

7
< p> ru 文化是中性的,意味着它不能用于格式化和解析。另一方面,ru-RU 文化是具体的(演示 #1),因此您可以使用它来格式化和解析数据。

比较这两种文化的页面显示,ru 提供了 ru-RU 的子集设置。

除其他事项外,尝试将中性文化设置为线程的当前文化会导致异常(在 Mono 上的演示 #2,在 .NET 4.5 上不会崩溃)。


你对第二个演示的理解是错误的。我已经运行了这段代码:var culture = CultureInfo.GetCultureInfo("ru"); Thread.CurrentThread.CurrentCulture = culture; 在(.NET 4.5)中没有任何运行时异常。 - Maris
1
@Maris 一个演示就是一个演示:它展示了一个事实,即有一个C#(碰巧是Mono)的实现会在你做某件事情时崩溃。它不会在其他系统上崩溃的事实是令人鼓舞的,但我认为知道它并不是普遍安全的是很好的。我根据您的评论编辑了答案。 - Sergey Kalinichenko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接