此中断性变更会以两种方式影响全球化不变模式。
- 以前,只要区域性名称符合 BCP-47,.NET 就允许在全球化固定模式下创建任何区域性。 但是,使用不变文化数据而不是实际文化数据。 从 .NET 6 开始,如果在全球化固定模式下创建除固定区域性之外的任何区域性,则会引发异常。
- 以前,全球化不变模式只支持 ASCII 字符的大小写映射。 从 .NET 6 开始,全球化不变模式为所有 Unicode 定义的字符提供完整的大小写映射支持。 大小写映射用于字符串比较、字符串搜索和大小写字符串等操作。
全球化固定模式 用于不需要任何全球化支持的应用。 也就是说,应用在没有访问文化特定数据和行为的情况下即可运行。 某些 Docker 容器(例如 Alpine 容器)默认启用全球化不变模式。
旧行为
在早期 .NET 版本中,启用全球化固定模式时:
如果应用程序创建的是非不变文化,那么操作将成功,但返回的文化始终使用不变文化数据,而不是真实的文化数据。
仅对 ASCII 字符执行大小写映射。 例如:
if ("Á".Equals("á", StringComparison.CurrentCultureIgnoreCase)) // Evaluates to false.
新行为
从 .NET 6 开始,启用全球化固定模式时:
如果应用尝试创建的区域性不是固定区域性,则会引发 CultureNotFoundException 异常。
对所有 Unicode 定义的字符执行事例映射。 例如:
if ("Á".Equals("á", StringComparison.CurrentCultureIgnoreCase)) // Evaluates to true.
已引入的版本
.NET 6
更改原因
引入了文化创建变更,以便更轻松地诊断与文化相关的问题。 某些用户不知道其应用在启用全球化固定模式的环境中运行。 它们可能会遇到意外行为,并且不会与全球化固定模式关联,因此很难诊断问题。
引入完全的大小写映射支持是为了在全球化固定模式下提供更好的可用性和体验。
建议的措施
在大多数情况下,无需执行任何操作。 但如果需要以前的区域性创建行为,可以设置运行时配置选项,以允许在全球化固定模式下创建任何区域性。 有关详细信息,请参阅 预定义文化。
受影响的 API
- CultureInfo
- System.Globalization.CultureInfo.CreateSpecificCulture(String)
- System.Globalization.CultureInfo.GetCultureInfo
- RegionInfo
- 执行字符串大小写、比较或搜索的任何 API