Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
.NET 5 и более поздних версий использует библиотеки ICU (международные компоненты для Юникода) для поддержки глобализации при работе в Windows 10 с обновлением за май 2019 года или более поздней версии.
Описание изменения
В .NET Core 1.0–3.1 и .NET Framework 4 и более поздних версиях библиотеки .NET используют API национальной языковой поддержки (NLS) для обеспечения глобализационной функциональности в Windows. Например, функции NLS применялись для сравнения строк, получения сведений о культуре и изменения регистра строк в соответствии с данной культурой.
Начиная с .NET 5, библиотеки .NET в приложениях, работающих в среде Windows 10 с обновлением за май 2019 года или более поздней версии, по умолчанию применяют 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: используйте порядковое StringComparison, чтобы найти эти места вызовов в вашем коде.
Дополнительные сведения см. в рекомендациях по сравнению строк в .NET.
Символ валют
Рассмотрим следующий код, который форматирует строку с помощью указателя формата валюты 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 валюта является свойством страны или региона, а не языка.
IdnMapping.GetAscii
Рассмотрите следующий код, который вызывает IdnMapping.GetAscii(String), чтобы преобразовать метку международного доменного имени в кодировку, совместимую с ASCII.
var mapping = new System.Globalization.IdnMapping();
string asciiName = mapping.GetAscii("ABCDEFG");
Console.WriteLine(asciiName);
- В .NET Core 3.1 и более ранних версиях на Windows фрагмент кода выводит
ABCDEFG. - В .NET 5 и более поздних версиях на Windows 10 начиная с обновления за май 2019 года и в более поздних версиях фрагмент кода выводится
abcdefg.
ICU приводит метки доменных имен в нижний регистр в рамках процесса кодирования, совместимого с ASCII. NLS не содержит строчные метки, содержащие международные символы, поэтому исходный регистр сохраняется.
Сокращения дней недели
Метод DateTimeFormatInfo.GetShortestDayName(DayOfWeek) получает короткое сокращенное имя дня для указанного дня недели.
- В .NET Core 3.1 и более ранних версиях в Windows эти сокращения дня недели состоят из двух символов, например Su.
- В .NET 5 и более поздних версиях эти сокращения дня недели состоят только из одного символа, например "S".
Причина изменения
Это изменение введено для унификации поведения глобализации .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> (если набор содержит строки)