Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В версиях .NET 7 и более поздних используются международные компоненты для Юникода (ICU) для обеспечения функций глобализации при работе на Windows Server 2019. Выпуски Windows, не являющиеся серверными, используют ICU с .NET 5. Однако .NET 7 представила поддержку загрузки ICU в более ранних клиентских версиях Windows, в частности Windows 10 версий 1703, 1709, 1803 и 1809.
Предыдущее поведение
В .NET 5 и .NET 6 библиотеки .NET использовали API-интерфейсы поддержки национальных языков (NLS) для функций глобализации в Windows Server 2019. Например, функции NLS использовались для сравнения строк, получения сведений о культурной информации и изменения регистра строк в соответствующей культуре. Это поведение также применяется к клиентским версиям Windows 10, таким как 1703, 1709, 1803 и 1809.
Новое поведение
Начиная с .NET 7, если приложение работает на Windows Server 2019 или клиентских версиях Windows 10 1703, 1709, 1803 и 1809, библиотеки .NET используют API глобализации ICU по умолчанию. (Версии Windows, отличные от сервера, уже использовали ICU с .NET 5, поэтому для этих версий нет изменений.)
Различия в поведении
Вы можете увидеть изменения в приложении, даже если вы не понимаете, что используете средства глобализации. В следующем примере показан один из изменений поведения, которые вы можете увидеть, но есть и другие.
Символ валюты
Рассмотрим следующий код, который форматирует строку с помощью описателя C
формата валюты. Текущая культура потока настроена так, чтобы включать только язык, без учета страны или региона.
System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("de");
string text = string.Format("{0:C}", 100);
- В .NET 5 и .NET 6 на Windows Server 2019 или на клиентских версиях Windows 10 1703, 1709, 1803 и 1809, значение текста равно
"100,00 €"
. - В .NET 7 в Windows Server 2019 или Windows 10 версии 1703, 1709, 1803 и 1809 значение текста
"100,00 ¤"
, который использует международный символ валюты вместо евро. В ICU дизайн заключается в том, что валюта является свойством страны или региона, а не языка.
Причина изменения
- .NET представил некоторые API, зависящие от библиотек ICU, например TimeZoneInfo.TryConvertIanaIdToWindowsId(String, String). Пользователям, которые хотели использовать такие API в Windows Server 2019, требовалось вручную развернуть библиотеки ICU с двоичными файлами с помощью функции локального приложения ICU. Это не было отличным решением, так как код может находиться в библиотеке, которая не может управлять принудительной установкой библиотек ICU с любым приложением или службой, использующим библиотеку.
- Если Windows Server 2019 автоматически предоставляется облачной платформой (например, Azure), развернутая служба не обязательно знает, что она будет работать на таком сервере. Кроме того, владелец службы должен решать, следует ли и когда развертывать двоичные файлы ICU. Кроме того, каждая служба, развернутая в облаке на основе Windows Server 2019, для использования которых требуются новые API, зависящие от ICU .NET, необходимо развернуть вместе с службой двоичные файлы ICU. Это может увеличить занимаемое место на диске сервера.
- Некоторые пользователи предпочитают использовать ICU по умолчанию, так как он соответствует стандарту Юникода.
Представленная версия
.NET 7
Рекомендуемое действие
Если вы используете .NET 7 в Windows Server 2019 или Windows 10 клиентских версий 1703, 1709, 1803 или 1809, мы рекомендуем протестировать ваше приложение или службу перед выпуском, чтобы убедиться, что поведение соответствует ожиданиям и не создает проблем для пользователей.
Если вы хотите продолжить использование API глобализации NLS, можно задать переключатель во время выполнения , чтобы вернуться к такому поведению. Дополнительные сведения о доступных переключателях см. статью о глобализации .NET и ICU.
Затронутые API
- System.Span<T>
- System.String
- Большинство типов в System.Globalization пространстве имен
- System.Array.Sort (при сортировке массива строк)
- System.Collections.Generic.List<T>.Sort() (если элементы списка являются строками)
- System.Collections.Generic.SortedDictionary<TKey,TValue> (если ключи являются строками)
- System.Collections.Generic.SortedList<TKey,TValue> (если ключи являются строками)
- System.Collections.Generic.SortedSet<T> (если набор содержит строки)