全球化固定模式下的区域性创建和大小写映射
此中断性变更通过以下两种方式影响全球化固定模式:
- 以前,只要区域性名称符合 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