API глобализации используют библиотеки ICU в Windows 10
.NET 5 и более поздних версий использует библиотеки ICU (международные компоненты для Юникода) для поддержки глобализации при работе в Windows 10 с обновлением за май 2019 года или более поздней версии.
Описание изменения
В .NET Core 1.0–3.1 и .NET Framework 4 и более поздних версий библиотеки .NET используют для функции глобализации в Windows API Многоязыковой поддержки (NLS). Например, функции NLS применялись для сравнения строк, получения данных о языке и региональных параметрах, а также для изменения капитализации строк в соответствии с необходимыми языком и региональными параметрами.
Начиная с .NET 5 для приложений в среде Windows 10 с обновлением за май 2019 года или более поздней версии библиотеки .NET по умолчанию используют API-интерфейсы глобализации ICU.
Примечание.
В Windows 10 с обновлением за май 2019 года и более поздних версий входит библиотека ICU. Если среда выполнения .NET не может загрузить ICU, вместо нее используется NLS.
Различия в поведении
Вы можете заметить изменения в приложении, даже если не догадываетесь, что используете средства глобализации. В этом разделе перечислено несколько из возможных изменений поведения.
String.IndexOf
Рассмотрим следующий код, который вызывает String.IndexOf(String), чтобы найти в строке индекс символа новой строки.
string s = "Hello\r\nworld!";
int idx = s.IndexOf("\n");
Console.WriteLine(idx);
- В .NET Core 3.1 и более ранних версиях в Windows фрагмент кода печатается
6
. - В .NET 5 и на обновление Windows 10 за май 2019 г. и более поздних версиях фрагмент кода печатается
-1
. - В .NET 6 и более поздних версиях фрагмент кода печатается
6
, однако библиотеки ICU по-прежнему используются.
Чтобы исправить этот код, выполняя порядковый поиск вместо поиска с учетом языка и региональных параметров, вызовите перегрузку IndexOf(String, StringComparison) и передайте в нее в качестве аргумента StringComparison.Ordinal.
Правила анализа кода CA1307: укажите StringComparison для ясности и CA1309: используйте порядковый кодComparison , чтобы найти эти сайты вызовов в коде.
Дополнительные сведения см. в статье Изменения поведения при сравнении строк в .NET 5+.
Символ валют
Рассмотрим следующий код, который форматирует строку с помощью указателя формата валюты C
. Язык и региональные параметры текущего потока задаются для языка и региональных параметров, включая только язык, а не страну или регион.
System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("de");
string text = string.Format("{0:C}", 100);
- В .NET Core 3.1 и более ранних версиях в Windows значение текста равно
"100,00 €"
. - В .NET 5 и более поздних версиях в Windows 19H1 и более поздних версий значение text равно
"100,00 ¤"
, и вместо евро в нем используется международный символ валюты. В ICU валюта является свойством страны или региона, а не языка.
Причина изменения
Это изменение введено для унификации поведения глобализации .NET во всех поддерживаемых операционных системах. Благодаря ему приложения смогут объединять собственные библиотеки глобализации и не зависеть от встроенных библиотек операционных систем.
Представленные версии
.NET 5.0
Рекомендуемое действие
От разработчика не требуется никаких действий. Но если вы хотите по-прежнему использовать 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> (если набор содержит строки)
См. также
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по