Interfejsy API globalizacji używają bibliotek ICU w systemie Windows 10
Platforma .NET 5 i nowsze wersje używają bibliotek International Components for Unicode (ICU) na potrzeby funkcji globalizacji podczas uruchamiania w systemie Aktualizacja systemu Windows 10 z maja 2019 lub nowszym.
Opis zmiany
W programie .NET Core 1.0 — 3.1 i .NET Framework 4 lub nowszym biblioteki platformy .NET używają interfejsów API national language support (NLS) na potrzeby funkcji globalizacji w systemie Windows. Na przykład funkcje NLS były używane do porównywania ciągów, pobierania informacji o kulturze i wykonywania wielkości liter ciągów w odpowiedniej kulturze.
Począwszy od platformy .NET 5, jeśli aplikacja jest uruchomiona w Aktualizacja systemu Windows 10 z maja 2019 lub nowszym, biblioteki platformy .NET domyślnie używają interfejsów API globalizacji ICU.
Uwaga
Aktualizacja systemu Windows 10 z maja 2019 i nowsze wersje są dostarczane z natywną biblioteką ICU. Jeśli środowisko uruchomieniowe platformy .NET nie może załadować operacji we/wy, zamiast tego używa nls.
Różnice behawioralne
Zmiany w aplikacji mogą być widoczne, nawet jeśli nie zdajesz sobie sprawy, że używasz obiektów globalizacji. W tej sekcji wymieniono kilka zmian behawioralnych, które mogą zostać wyświetlone, ale istnieją też inne.
String.IndexOf
Rozważ następujący kod, który wywołuje String.IndexOf(String) metodę w celu znalezienia indeksu znaku nowego wiersza w ciągu.
string s = "Hello\r\nworld!";
int idx = s.IndexOf("\n");
Console.WriteLine(idx);
- W programie .NET Core 3.1 i starszych wersjach w systemie Windows fragment kodu drukuje
6
. - W programie .NET 5 i w wersjach Aktualizacja systemu Windows 10 z maja 2019 i nowszych fragment kodu drukuje
-1
element . - W wersjach .NET 6 i nowszych fragment kodu drukuje
6
jednak biblioteki ICU nadal są używane.
Aby naprawić ten kod, przeprowadzając wyszukiwanie porządkowe zamiast wyszukiwania wrażliwego na kulturę, wywołaj IndexOf(String, StringComparison) przeciążenie i przekaż jako StringComparison.Ordinal argument.
Reguły analizy kodu CA1307: Określ ciągComparison dla jasności i CA1309: Użyj porządkowego ciąguComparison , aby znaleźć te witryny wywołania w kodzie.
Aby uzyskać więcej informacji, zobacz Zmiany zachowania podczas porównywania ciągów na platformie .NET 5+.
Symbol waluty
Rozważ następujący kod, który formatuje ciąg przy użyciu specyfikatora C
formatu waluty . Kultura bieżącego wątku jest ustawiona na kulturę obejmującą tylko język, a nie kraj lub region.
System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("de");
string text = string.Format("{0:C}", 100);
- W programie .NET Core 3.1 i starszych wersjach systemu Windows wartość tekstu to
"100,00 €"
. - W wersji .NET 5 i nowszych w systemie Windows 19H1 i nowszych wersjach wartość tekstu to
"100,00 ¤"
, która używa symbolu waluty międzynarodowej zamiast euro. W ICU projekt polega na tym, że waluta jest właściwością kraju lub regionu, a nie języka.
Skróty dni tygodnia
Metoda DateTimeFormatInfo.GetShortestDayName(DayOfWeek) uzyskuje najkrótszą skróconą nazwę dnia dla określonego dnia tygodnia.
- W wersji .NET Core 3.1 i starszych w systemie Windows skróty dnia tygodnia składały się z dwóch znaków, na przykład "Su".
- W wersjach .NET 5 i nowszych skróty dnia tygodnia składają się tylko z jednego znaku, na przykład "S".
Przyczyna wprowadzenia zmiany
Ta zmiana została wprowadzona w celu ujednolicenia . Zachowanie globalizacji platformy NET we wszystkich obsługiwanych systemach operacyjnych. Zapewnia również aplikacjom możliwość tworzenia pakietów własnych bibliotek globalizacji, a nie zależności od wbudowanych bibliotek systemu operacyjnego.
Wprowadzona wersja
.NET 5.0
Zalecana akcja
Ze strony dewelopera nie jest wymagana żadna akcja. Jeśli jednak chcesz nadal korzystać z interfejsów API globalizacji nlS, możesz ustawić przełącznik czasu wykonywania, aby przywrócić to zachowanie. Aby uzyskać więcej informacji na temat dostępnych przełączników, zobacz artykuł Globalizacja platformy .NET i ICU .
Dotyczy interfejsów API
- System.Span<T>
- System.String
- Większość typów w System.Globalization przestrzeni nazw
- System.Array.Sort (podczas sortowania tablicy ciągów)
- System.Collections.Generic.List<T>.Sort() (gdy elementy listy są ciągami)
- System.Collections.Generic.SortedDictionary<TKey,TValue> (gdy klucze są ciągami)
- System.Collections.Generic.SortedList<TKey,TValue> (gdy klucze są ciągami)
- System.Collections.Generic.SortedSet<T> (gdy zestaw zawiera ciągi)