Globalisierungs-APIs verwenden ICU-Bibliotheken unter Windows 10

.NET 5 und höhere Versionen verwenden bei der Ausführung unter dem Windows 10-Update vom Mai 2019 oder später ICU-Bibliotheken (International Components for Unicode, internationale Komponenten für Unicode) für die Globalisierungsfunktionalität.

Änderungsbeschreibung

In .NET Core 1.0-3.1 und .NET Framework 4 und höher verwenden .NET-Bibliotheken NLS-APIs (National Language Support) für Globalisierungsfunktionalität unter Windows. Beispielsweise wurden NLS-Funktionen verwendet, um Zeichenfolgen zu vergleichen, Informationen zur Kultur abzurufen und Groß-/Kleinschreibung von Zeichenfolgen gemäß der entsprechenden Kultur umzusetzen.

Ab .NET 5 verwenden .NET-Bibliotheken standardmäßig Globalisierungs-APIs von ICU, wenn eine Anwendung unter Windows 10 mit Update vom Mai 2019 oder höher ausgeführt wird.

Hinweis

Das Windows 10-Update von Mai 2019 und spätere Versionen werden mit der nativen ICU-Bibliothek ausgeliefert. Wenn die .NET-Runtime ICU nicht laden kann, verwendet sie stattdessen NLS.

Verhaltensunterschiede

Möglicherweise bemerken Sie Änderungen in Ihrer Anwendung, auch wenn Sie sich nicht bewusst sind, dass Sie Globalisierungsfunktionen nutzen. In diesem Abschnitt finden einige der Verhaltensänderungen, die Sie möglicherweise beobachten, aber es gibt noch weitere.

String.IndexOf

Betrachten Sie den folgenden Code, der String.IndexOf(String) aufruft, um den Index des Zeilenvorschubzeichens in einer Zeichenfolge zu finden.

string s = "Hello\r\nworld!";
int idx = s.IndexOf("\n");
Console.WriteLine(idx);
  • In .NET Core 3.1 und früheren Versionen unter Windows gibt der Codeschnipsel 6 aus.
  • In .NET 5 und im Windows 10-Update vom Mai 2019 und höheren Versionen gibt der Schnipsel -1 aus.
  • In .NET 6 und höheren Versionen gibt der Codeschnipsel 6 aus, ICU-Bibliotheken werden aber weiterhin verwendet.

Um diesen Code durch eine ordinale Suche anstelle einer kulturabhängigen Suche zu korrigieren, rufen Sie die Überladung IndexOf(String, StringComparison) auf, an die Sie StringComparison.Ordinal als Argument übergeben.

Sie können Codeanalyseregeln entsprechend CA1307: Angeben von StringComparison für mehr Klarheit und CA1309: Verwenden eines ordinalen StringComparison ausführen, um diese Aufrufstellen in Ihrem Code zu finden.

Weitere Informationen finden Sie unter Verhaltensänderungen beim Vergleichen von Zeichenfolgen ab .NET 5.

Währungssymbol

Betrachten Sie den folgenden Code, der eine Zeichenfolge mit C als Spezifizierer des Währungsformats formatiert. Die Kultur des aktuellen Threads ist auf eine Kultur festgelegt, die nur die Sprache und nicht das Land oder die Region umfasst.

System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("de");
string text = string.Format("{0:C}", 100);
  • In .NET Core 3.1 und früheren Versionen unter Windows lautet der Wert des Texts "100,00 €".
  • Ab .NET 5 unter Windows 19H1 und späteren Versionen ist der Wert des Texts "100,00 ¤", der das internationale Währungssymbol anstelle von Euro verwendet. In ICU ist eine Währung eine Eigenschaft eines Landes oder einer Region und nicht einer Sprache.

Wochentag, Abkürzungen

Die DateTimeFormatInfo.GetShortestDayName(DayOfWeek) Methode ruft den kürzesten abgekürzten Tagnamen für einen angegebenen Wochentag ab.

  • In .NET Core 3.1 und früheren Versionen unter Windows bestand diese Abkürzung für einen Wochentag aus zwei Zeichen, z. B. "So".
  • In .NET 5 und höheren Versionen bestehen diese Abkürzung für einen Wochentag aus nur einem Zeichen, z. B. "S".

Grund für die Änderung

Diese Änderung wurde eingeführt, um das Globalisierungsverhalten von .NET in allen unterstützten Betriebssystemen zu vereinheitlichen. Darüber hinaus können Anwendungen ihre eigenen Globalisierungsbibliotheken bündeln, anstatt von den in das Betriebssystem integrierten Bibliotheken abhängig zu sein.

Eingeführt in Version

.NET 5.0

Auf der Seite des Entwicklers ist keine Aktion erforderlich. Wenn Sie jedoch weiterhin NLS-Globalisierungs-APIs verwenden möchten, können Sie einen Runtimeschalter festlegen, um zu diesem Verhalten zurückzukehren. Weitere Informationen zu den verfügbaren Schaltern finden Sie im Artikel .NET-Globalisierung und ICU.

Betroffene APIs

Weitere Informationen