Создание языка и региональных параметров и сопоставление регистра в инвариантном режиме глобализации
Это критическое изменение затрагивает инвариантный режим глобализации двумя способами:
- Ранее платформа .NET позволяла создавать любые языки и региональные параметры в инвариантном режиме глобализации, если имя языка и региональных параметров соответствовало спецификации BCP-47. Однако вместо реальных данных использовались данные инвариантных языка и региональных параметров. Начиная с .NET 6, при создании любых языка и региональных параметров, отличных от инвариантных, в инвариантном режиме глобализации выдается исключение.
- Ранее инвариантный режим глобализации поддерживал сопоставление регистра только для символов ASCII. Начиная с .NET 6, инвариантный режим глобализации обеспечивает полную поддержку сопоставления регистра для всех символов, определенных в Юникоде. Сопоставление регистра используется в таких операциях, как сравнение строк, поиск строк, а также перевод строк в верхний или нижний регистр.
Инвариантный режим глобализации используется для приложений, не требующих поддержку глобализации. Это значит, что приложение выполняется без доступа к данным и поведению, зависящим от языка и региональных параметров. Инвариантный режим глобализации по умолчанию включен в некоторых контейнерах Docker, например в контейнерах Alpine.
Старое поведение
В предыдущих версиях .NET при включенном инвариантном режиме глобализации имело место следующее:
Если приложение создает язык и региональные параметры, не являющиеся инвариантными, операция завершается успешно, но возвращаемые язык и региональные параметры всегда используют данные инвариантных языка и региональных параметров вместо реальных данных.
Сопоставление регистра выполнялось только для символов ASCII. Например:
if ("Á".Equals("á", StringComparison.CurrentCultureIgnoreCase)) // Evaluates to false.
Новое поведение
Начиная с .NET 6, при включенном инвариантном режиме глобализации имеет место следующее:
Если приложение пытается создать язык и региональные параметры, не являющиеся инвариантными, возникает исключение CultureNotFoundException.
Сопоставление регистра выполняется для всех символов, определенных в Юникоде. Например:
if ("Á".Equals("á", StringComparison.CurrentCultureIgnoreCase)) // Evaluates to true.
Представленные версии
.NET 6
Причина изменения
Такое изменение создания языка и региональных параметров было внесено, чтобы упростить диагностику проблем, связанных с языком и региональными параметрами. Некоторые пользователи не догадываются, что их приложения выполняются в среде с включенным инвариантным режимом глобализации. Они могут столкнуться с непредвиденным поведением и не связывать его с инвариантным режимом глобализации, что затрудняет диагностирование проблемы.
Полная поддержка сопоставления регистра была введена для повышения удобства использования и улучшения взаимодействия в инвариантном режиме глобализации.
Рекомендуемое действие
В большинстве случаев никаких действий выполнять не требуется. Однако, если вам требуется предыдущее поведение при создании языка и региональных параметров, можно задать параметр конфигурации времени выполнения, чтобы разрешить создание любых языка и региональных параметров в инвариантном режиме глобализации. Дополнительные сведения см. в разделе Предопределенные языки и региональные параметры.
Затронутые API
- CultureInfo
- System.Globalization.CultureInfo.CreateSpecificCulture(String)
- System.Globalization.CultureInfo.GetCultureInfo
- RegionInfo
- Любые интерфейсы API, выполняющие сравнение или поиск строк, а также работу с регистром строк