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

Ste*_*ano 5 .net winapi cultureinfo

我依靠 .NET CultureInfo 对象来获取某些自定义文化的父文化(自定义是指它们代表与非官方语言配对的国家,例如:\'en-IT\' 或 \'fr-DE\') 。

\n\n

一切工作正常,但当繁体中文(zh-Hant)与中国(通常应该与香港)配对时,我遇到了问题。

\n\n

问题是:在我的开发计算机 (Windows 10) 中,对于特定区域性的“Parent”属性,我的输出与临时服务器 (Windows Server 2008R2) 上的输出不同。

\n\n

在此页面中,每个“传统”文化都将“CHT”(LCID 0x7C04) 作为其父文化。\n https://msdn.microsoft.com/en-us/library/system.globalization.cultureinfo.parent(v=vs .110).aspx

\n\n

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

\n\n
class Program\n{\n    static void Main(string[] args)\n    {\n        System.Console.WriteLine(System.Environment.Version.ToString());\n        System.Console.WriteLine("zh-Hant-CN");\n        System.Console.WriteLine("Parent Name is: " + System.Globalization.CultureInfo.CreateSpecificCulture("zh-Hant-CN").Parent.Name);\n        System.Console.WriteLine("Parent LCID is: " + System.Globalization.CultureInfo.CreateSpecificCulture("zh-Hant-CN").Parent.EnglishName);\n        System.Console.WriteLine("Parent LCID is: " + System.Globalization.CultureInfo.CreateSpecificCulture("zh-Hant-CN").Parent.LCID);\n        System.Console.WriteLine("zh-Hans-CN");\n        System.Console.WriteLine("Parent Name is: " + System.Globalization.CultureInfo.CreateSpecificCulture("zh-Hans-CN").Parent.Name);\n        System.Console.WriteLine("Parent Name is: " + System.Globalization.CultureInfo.CreateSpecificCulture("zh-Hans-CN").Parent.EnglishName);\n        System.Console.WriteLine("Parent LCID is: " + System.Globalization.CultureInfo.CreateSpecificCulture("zh-Hans-CN").Parent.LCID);\n\n        System.Console.WriteLine("Same culture: " + System.Globalization.CultureInfo.CreateSpecificCulture("zh-Hant-CN")\n           .Equals(System.Globalization.CultureInfo.CreateSpecificCulture("zh-Hans-CN")).ToString()\n        );\n        System.Console.ReadKey();\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n
    \n
  • 使用 AnyCpu 在调试中作为已编译的 exe 运行
  • \n
  • 定位框架字 4.6.2(尝试使用 4.5.0,结果相同)
  • \n
  • 已安装所有最新的 Windows 更新
  • \n
\n\n

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

\n\n
4.0.30319.42000\nzh-Hant-CN\nParent Name is: zh-CHT\nParent LCID is: Chinese (Traditional) Legacy\nParent LCID is: 31748\nzh-Hans-CN\nParent Name is: zh-CHS\nParent Name is: Chinese (Simplified) Legacy\nParent LCID is: 4\nSame culture: False\n
Run Code Online (Sandbox Code Playgroud)\n\n

输出:Win Server 2008R2、Win Server 2012R2、Win 8、Win 7。是:

\n\n
4.0.30319.42000\nzh-Hant-CN\nParent Name is: zh-CHS\nParent LCID is: Chinese (Simplified) Legacy\nParent LCID is: 4\nzh-Hans-CN\nParent Name is: zh-CHS\nParent Name is: Chinese (Simplified) Legacy\nParent LCID is: 4\nSame culture: True\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

谢谢。

\n\n

PS:请原谅我糟糕的英语。

\n\n

更新

\n\n

我确实在兔子洞中挖得更深......\n从框架的源代码(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 来检索父区域性名称。 。

\n\n

做了更多的测试,我发现,用 \'zh-Han?-*\' 调用该 Api 会导致ERROR_INVALID_PARAMETER,但显然仅在非 Windows 10 计算机上...

\n\n

所以我将为这个问题添加更多标签。

\n\n

更新#2

\n\n

不仅繁体中文有一个简体中文作为父级,甚至使用“zh-Hans-CN”创建的简体中文也有错误的 DateTimeFormat 关联:例如月份名称以繁体中文表示(\xe4\xb8\x80\xe6 \x9c\x88) 而不是简化版本 (1\xe6\x9c\x88)

\n\n

即此代码仅在 Windows < 10 上输出“同月:true”:

\n\n

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

\n