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

См. также