Поделиться через


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 валюта является свойством страны или региона, а не языка.

Сокращение дня недели

Метод DateTimeFormatInfo.GetShortestDayName(DayOfWeek) получает короткое сокращенное имя дня для указанного дня недели.

  • В .NET Core 3.1 и более ранних версиях в Windows эти сокращения дня недели состоят из двух символов, например Su.
  • В .NET 5 и более поздних версиях эти сокращения дня недели состоят только из одного символа, например "S".

Причина изменения

Это изменение введено для унификации поведения глобализации .NET во всех поддерживаемых операционных системах. Благодаря ему приложения смогут объединять собственные библиотеки глобализации и не зависеть от встроенных библиотек операционных систем.

Представленные версии

.NET 5.0

От разработчика не требуется никаких действий. Но если вы хотите по-прежнему использовать API-интерфейсы глобализации NLS, настройте параметр времени выполнения, чтобы вернуться к старому поведению. Дополнительные сведения о доступных параметрах см. в статье Глобализация .NET и ICU.

Затронутые API

См. также