Udostępnij za pośrednictwem


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 -1element .
  • W wersjach .NET 6 i nowszych fragment kodu drukuje 6jednak 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 Cformatu 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

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

Zobacz też