全球化 API 在 Windows Server 2019 上使用 ICU 库

在 Windows Server 2019 上运行时,.NET 7 及更高版本使用 Unicode (ICU) 库的国际组件 实现全球化功能。 自 .NET 5 以来,非服务器版本的 Windows 一直在使用 ICU。 但是,.NET 7 引入了在早期 Windows 客户端版本中加载 ICU 的支持,特别是 Windows 10 版本 1703、1709、1803 和 1809。

以前的行为

在 .NET 5 和 .NET 6 中,.NET 库使用 国家语言支持 (NLS) API 在 Windows Server 2019 上实现全球化功能。 例如,NLS 函数用于比较字符串,获取区域性信息,并在适当的区域中执行字符串大小写。 此行为也适用于 Windows 10 客户端版本,例如 1703、1709、1803 和 1809。

新行为

从 .NET 7 开始,如果应用在 Windows Server 2019 或 Windows 10 客户端版本 1703、1709、1803 和 1809 上运行,则 .NET 库默认使用 ICU 全球化 API。 ( 自 .NET 5 以来,非服务器 Windows 版本一直在使用 ICU,因此这些版本没有变化。

行为差异

即使你没有意识到自己正在使用全球化功能,你也可能会在应用中看到变化。 以下示例显示了你可能会看到的行为更改之一,但也有其他行为更改。

货币符号

请考虑以下使用货币格式说明符 C设置字符串格式的代码。 当前线程的区域性设置为仅包括语言(而非国家或地区)的区域性。

System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("de");
string text = string.Format("{0:C}", 100);
  • 在 Windows Server 2019 或 Windows 10 客户端版本 1703、1709、1803 和 1809 上的 .NET 5 和 .NET 6 中,文本值是 "100,00 €"
  • 在 Windows Server 2019 或 Windows 10 客户端版本 1703、1709、1803 和 1809 上的 .NET 7 中,文本中数值 "100,00 ¤" 使用国际货币符号,而不是欧元符号。 在 ICU 中,设计是货币是国家或地区的属性,而不是语言。

更改原因

  • 例如,.NET 引入了一些依赖于 ICU 库 TimeZoneInfo.TryConvertIanaIdToWindowsId(String, String)的 API。 想要在 Windows Server 2019 上使用此类 API 的用户需要使用 ICU 应用本地功能手动部署 ICU 库及其二进制文件。 这不是一个很好的解决方案,因为代码可能位于一个库中,而这个库无法控制 ICU 库是否与使用该库的任何应用或服务一起安装。
  • 如果云平台(如 Azure)自动提供 Windows Server 2019,则部署的服务不一定知道它将在此类服务器上运行。 此外,服务所有者必须管理何时以及如何部署 ICU 二进制文件。 此外,使用 Windows Server 2019 部署到云的每个服务都需要使用与 .NET ICU 相关的新 API 来部署该服务的 ICU 二进制文件。 这可以膨胀服务器上的磁盘大小。
  • 某些用户默认更喜欢使用 ICU,因为它符合 Unicode 标准版的更多要求。

已引入的版本

.NET 7

如果在 Windows Server 2019 或 Windows 10 客户端版本 1703、1709、1803 或 1809 上使用 .NET 7,建议在寄送应用或服务之前对其进行测试,以确保行为按预期运行,不会破坏任何用户。

如果要继续使用 NLS 全球化 API,可以设置 运行时开关 以还原到该行为。 有关可用交换机的详细信息,请参阅 .NET 全球化和 ICU 文章。

受影响的 API

另请参阅