Dela via


Globaliserings-API:er använder ICU-bibliotek i Windows 10

.NET 5 och senare versioner använder ICU-bibliotek (International Components for Unicode) för globaliseringsfunktioner när de körs på Maj 2019-uppdatering för Windows 10 eller senare.

Ändra beskrivning

I .NET Core 1.0– 3.1 och .NET Framework 4 och senare använder .NET-bibliotek NLS-API:er (National Language Support) för globaliseringsfunktioner i Windows. NLS-funktioner användes till exempel för att jämföra strängar, hämta kulturinformation och utföra stränghölje i lämplig kultur.

Från och med .NET 5 använder .NET-bibliotek som standard ICU-globaliserings-API:er om en app körs på Maj 2019-uppdatering för Windows 10 eller senare.

Kommentar

Maj 2019-uppdatering för Windows 10 och senare versioner levereras med det interna ICU-biblioteket. Om .NET-körningen inte kan läsa in ICU använder den NLS i stället.

Beteendeskillnader

Du kan se ändringar i din app även om du inte inser att du använder globaliseringsanläggningar. I det här avsnittet visas några av de beteendeändringar som du kan se, men det finns även andra.

String.IndexOf

Tänk på följande kod som anropar String.IndexOf(String) för att hitta indexet för det nya radtecknet i en sträng.

string s = "Hello\r\nworld!";
int idx = s.IndexOf("\n");
Console.WriteLine(idx);
  • I .NET Core 3.1 och tidigare versioner i Windows skriver kodfragmentet ut 6.
  • I .NET 5 och på Maj 2019-uppdatering för Windows 10 och senare versioner skriver kodfragmentet ut -1.
  • I .NET 6 och senare versioner skriver kodfragmentet ut 6, men ICU-bibliotek används fortfarande.

Om du vill åtgärda den här koden genom att utföra en ordningstalssökning i stället för en kulturkänslig sökning anropar du överbelastningen IndexOf(String, StringComparison) och skickar den StringComparison.Ordinal som ett argument.

Du kan köra kodanalysregler CA1307: Ange StringComparison för tydlighetens skull och CA1309: Använd ordningstalssträngKomparison för att hitta dessa anropswebbplatser i koden.

Mer information finns i Beteendeändringar vid jämförelse av strängar på .NET 5+.

Valutasymbol

Överväg följande kod som formaterar en sträng med hjälp av valutaformatsspecificeraren C. Den aktuella trådens kultur är inställd på en kultur som endast innehåller språket och inte landet eller regionen.

System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("de");
string text = string.Format("{0:C}", 100);
  • I .NET Core 3.1 och tidigare versioner i Windows är "100,00 €"värdet för text .
  • I .NET 5 och senare versioner på Windows 19H1 och senare versioner är "100,00 ¤"värdet för text , som använder den internationella valutasymbolen i stället för euron. I ICU är designen att en valuta är en egenskap för ett land eller en region, inte ett språk.

Förkortningar för veckodag

Metoden DateTimeFormatInfo.GetShortestDayName(DayOfWeek) hämtar det kortaste förkortade dagnamnet för en angiven veckodag.

  • I .NET Core 3.1 och tidigare versioner i Windows bestod dessa veckodagars förkortningar av två tecken, till exempel "Su".
  • I .NET 5 och senare versioner består dessa veckodagars förkortningar av endast ett tecken, till exempel "S".

Orsak till ändringen

Den här ändringen infördes för att ena . NET:s globaliseringsbeteende i alla operativsystem som stöds. Det ger också möjlighet för program att paketerar sina egna globaliseringsbibliotek i stället för att vara beroende av operativsystemets inbyggda bibliotek.

Version introducerad

.NET 5.0

Ingen åtgärd krävs från utvecklarens sida. Men om du vill fortsätta använda NLS-globaliserings-API:er kan du ange en körningsväxel för att återgå till det beteendet. Mer information om tillgängliga växlar finns i artikeln om .NET-globalisering och ICU .

Berörda API:er

Se även