Share via


Globalization-API's maken gebruik van ICU-bibliotheken in Windows Server 2019

.NET 7- en latere versies maken gebruik van ICU-bibliotheken (International Components for Unicode) voor globalisatiefunctionaliteit bij uitvoering op Windows Server 2019. Niet-serverversies van Windows gebruiken ICU sinds .NET 5. .NET 7 introduceerde echter ondersteuning voor het laden van ICU in eerdere Windows-clientversies, met name Windows 10 versies 1703, 1709, 1803 en 1809.

Vorig gedrag

In .NET 5 en .NET 6 gebruikten de .NET-bibliotheken NLS-API's (National Language Support) voor globalisatiefunctionaliteit op Windows Server 2019. NlS-functies werden bijvoorbeeld gebruikt om tekenreeksen te vergelijken, cultuurinformatie op te halen en tekenreeksbehuizing uit te voeren in de juiste cultuur. Dit gedrag wordt ook toegepast op Windows 10-clientversies, zoals 1703, 1709, 1803 en 1809.

Nieuw gedrag

Vanaf .NET 7, als een app wordt uitgevoerd op Windows Server 2019 of Windows 10-clientversies 1703, 1709, 1803 en 1809, gebruiken .NET-bibliotheken standaard ICU globalization-API's. (Windows-versies zonder server hebben al ICU gebruikt sinds .NET 5, dus er is geen wijziging voor deze versies.)

Gedragsverschillen

Mogelijk ziet u wijzigingen in uw app, zelfs als u zich niet realiseert dat u gebruikmaakt van globalisatiefaciliteiten. In het volgende voorbeeld ziet u een van de gedragswijzigingen die u kunt zien, maar er zijn ook andere.

Valutasymbool

Houd rekening met de volgende code waarmee een tekenreeks wordt opgemaakt met behulp van de valutanotatieaanduiding C. De cultuur van de huidige thread is ingesteld op een cultuur die alleen de taal en niet het land of de regio bevat.

System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("de");
string text = string.Format("{0:C}", 100);
  • In .NET 5 en .NET 6 op Windows Server 2019- of Windows 10-clientversies 1703, 1709, 1803 en 1809 is "100,00 €"de waarde van tekst.
  • In .NET 7 op Windows Server 2019 of Windows 10-clientversies 1703, 1709, 1803 en 1809 is de waarde van tekst "100,00 ¤", die gebruikmaakt van het internationale valutasymbool in plaats van de euro. In de ICU is het ontwerp dat een valuta een eigenschap is van een land of regio, geen taal.

Reden voor wijziging

  • .NET heeft een aantal API's geïntroduceerd die afhankelijk zijn van ICU-bibliotheken, TimeZoneInfo.TryConvertIanaIdToWindowsId(String, String)bijvoorbeeld. Gebruikers die dergelijke API's wilden gebruiken in Windows Server 2019, moesten handmatig ICU-bibliotheken met hun binaire bestanden implementeren met behulp van de lokale functie ICU-app. Dit was geen uitstekende oplossing, omdat de code zich in een bibliotheek kan bevinden die niet kan bepalen of ICU-bibliotheken moeten worden geïnstalleerd met elke app of service die de bibliotheek gebruikt.
  • Als Windows Server 2019 automatisch wordt geleverd door een cloudplatform (zoals Azure), weet de geïmplementeerde service niet per se dat deze op een dergelijke server wordt uitgevoerd. De service-eigenaar moet ook beheren of/wanneer binaire ICU-bestanden moeten worden geïmplementeerd. Bovendien moet elke service die is geïmplementeerd in de cloud met Windows Server 2019 die de nieuwe .NET ICU-afhankelijke API's wil gebruiken, de binaire ICU-bestanden van de service implementeren. Dit kan de grootte op de schijf op de server opbloat.
  • Sommige gebruikers geven standaard de voorkeur aan het gebruik van ICU, omdat deze meer voldoet aan de Unicode-standaard.

Versie geïntroduceerd

.NET 7

Als u .NET 7 op Windows Server 2019 of Windows 10-clientversies 1703, 1709, 1803 of 1809 gebruikt, raden we u aan uw app of service te testen voordat u deze verzendt om ervoor te zorgen dat het gedrag naar verwachting is en geen gebruikers onderbreekt.

Als u NLS Globalization API's wilt blijven gebruiken, kunt u een runtime-switch instellen om terug te keren naar dat gedrag. Zie het artikel over .NET-globalisatie en ICU voor meer informatie over de beschikbare switches.

Betrokken API's

Zie ook