CultureInfo在不同机器中的不一致输出

时间:2016-09-29 10:38:57

标签: .net winapi cultureinfo

我依靠.NET CultureInfo对象来获得一些自定义文化的母文化(从他们代表与非官方语言配对的国家的定制,例如:'en-IT'或'fr-DE')。

一切都运转良好,但我遇到的问题是传统中文(zh-Hant)与中国配对(通常应该与香港配对)。

问题是:在我的开发机器(Windows 10)中,我的输出与登台服务器(Windows Server 2008R2)上的输出不同,特定文化的“父”属性。

从这个页面,每个“传统”文化都有“CHT”(LCID 0x7C04)作为她的母文化。 https://msdn.microsoft.com/en-us/library/system.globalization.cultureinfo.parent(v=vs.110).aspx

这是我正在运行的控制台应用程序:

class Program
{
    static void Main(string[] args)
    {
        System.Console.WriteLine(System.Environment.Version.ToString());
        System.Console.WriteLine("zh-Hant-CN");
        System.Console.WriteLine("Parent Name is: " + System.Globalization.CultureInfo.CreateSpecificCulture("zh-Hant-CN").Parent.Name);
        System.Console.WriteLine("Parent LCID is: " + System.Globalization.CultureInfo.CreateSpecificCulture("zh-Hant-CN").Parent.EnglishName);
        System.Console.WriteLine("Parent LCID is: " + System.Globalization.CultureInfo.CreateSpecificCulture("zh-Hant-CN").Parent.LCID);
        System.Console.WriteLine("zh-Hans-CN");
        System.Console.WriteLine("Parent Name is: " + System.Globalization.CultureInfo.CreateSpecificCulture("zh-Hans-CN").Parent.Name);
        System.Console.WriteLine("Parent Name is: " + System.Globalization.CultureInfo.CreateSpecificCulture("zh-Hans-CN").Parent.EnglishName);
        System.Console.WriteLine("Parent LCID is: " + System.Globalization.CultureInfo.CreateSpecificCulture("zh-Hans-CN").Parent.LCID);

        System.Console.WriteLine("Same culture: " + System.Globalization.CultureInfo.CreateSpecificCulture("zh-Hant-CN")
           .Equals(System.Globalization.CultureInfo.CreateSpecificCulture("zh-Hans-CN")).ToString()
        );
        System.Console.ReadKey();
    }
}
  • 在调试中使用AnyCpu
  • 作为已编译的exe运行
  • 定位框架字4.6.2(尝试使用4.5.0,结果相同)
  • 安装了所有最新的Windows更新

我的机器(Windows 10)上的输出是:

4.0.30319.42000
zh-Hant-CN
Parent Name is: zh-CHT
Parent LCID is: Chinese (Traditional) Legacy
Parent LCID is: 31748
zh-Hans-CN
Parent Name is: zh-CHS
Parent Name is: Chinese (Simplified) Legacy
Parent LCID is: 4
Same culture: False

输出:Win Server 2008R2,Win Server 2012R2,Win 8,Win 7.是:

4.0.30319.42000
zh-Hant-CN
Parent Name is: zh-CHS
Parent LCID is: Chinese (Simplified) Legacy
Parent LCID is: 4
zh-Hans-CN
Parent Name is: zh-CHS
Parent Name is: Chinese (Simplified) Legacy
Parent LCID is: 4
Same culture: True

知道可能是什么原因,或文化存储的位置(.Net / Windows)?

谢谢。

PS:请原谅我的坏英语。

更新

我确实在兔子洞里深挖了...... 从框架的源代码(http://referencesource.microsoft.com/#mscorlib/system/globalization/culturedata.cs,b7941d5fc1e6626d,references)我发现,在较低级别,调用 GetLocaleInfoEx https://msdn.microsoft.com/en-us/library/windows/desktop/dd318103(v=vs.85).aspx)Windows API来检索父文化名称。

做更多测试我发现,用'zh-Han? - *'调用Api会产生ERROR_INVALID_PARAMETER,但显然仅在非Windows 10机器上...

所以我要在问题中添加更多标签。

更新#2

不仅繁体中文有简体中文作为Parent,即使用“zh-Hans-CN”创建的简体中文也有错误的DateTimeFormat关联:例如月份名称用繁体中文(一月)表示而不是简化版(1月)

即。此代码仅在Windows上输出“Same month:true”< 10:

Console.WriteLine("Same month: " + CultureInfo.CreateSpecificCulture("zh-Hant-TW").DateTimeFormat.AbbreviatedMonthNames[0].Equals(CultureInfo.CreateSpecificCulture("zh-Hans-CN").DateTimeFormat.AbbreviatedMonthNames[0]).ToString());

0 个答案:

没有答案