Rozhraní API globalizace používají knihovny ICU ve Windows Serveru 2019
.NET 7 a novější verze používají knihovny International Components for Unicode (ICU) pro funkce globalizace při spuštění ve Windows Serveru 2019. Edice systému Windows, které nejsou serverovými edicemi, už od verze .NET 5 využívají ICU. .NET 7 však zavedl podporu načítání ICU ve starších verzích klienta Windows, konkrétně Windows 10 verze 1703, 1709, 1803 a 1809.
Předchozí chování
V .NET 5 a .NET 6 používaly knihovny .NET rozhraní API národní jazykové podpory (NLS) pro funkce globalizace ve Windows Serveru 2019. Například funkce NLS byly použity k porovnání řetězců, získání informací o jazykové verzi a provádění řetězce v příslušné jazykové verzi. Toto chování se také používá u klientských verzí Windows 10, například 1703, 1709, 1803 a 1809.
Nové chování
Počínaje rozhraním .NET 7 platí, že pokud aplikace běží na klientech Windows Serveru 2019 nebo Windows 10 verze 1703, 1709, 1803 a 1809, používají knihovny .NET ve výchozím nastavení rozhraní API pro globalizaci ICU . (Neserverové verze Windows už od verze .NET 5 používají ICU, takže pro tyto verze nedošlo k žádné změně.)
Rozdíly v chování
V aplikaci se můžou zobrazit změny, i když si neuvědomíte, že používáte zařízení globalizace. Následující příklad ukazuje jednu z změn chování, které můžete vidět, ale existují i další.
Symbol měny
Zvažte následující kód, který formátuje řetězec pomocí specifikátoru C
formátu měny . Jazyková verze aktuálního vlákna je nastavená na jazykovou verzi, která zahrnuje pouze jazyk, nikoli zemi nebo oblast.
System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("de");
string text = string.Format("{0:C}", 100);
- V .NET 5 a .NET 6 ve Windows Serveru 2019 nebo Windows 10 verze 1703, 1709, 1803 a 1809 je
"100,00 €"
hodnota textu . - V .NET 7 ve Windows Serveru 2019 nebo Windows 10 verze 1703, 1709, 1803 a 1809 je
"100,00 ¤"
hodnota textu , která používá místo eura symbol mezinárodní měny. V ICU je návrh, že měna je vlastnost země nebo oblasti, nikoli jazyk.
Důvod změny
- .NET zavedla některá rozhraní API, která závisí například TimeZoneInfo.TryConvertIanaIdToWindowsId(String, String)na knihovnách ICU. Uživatelé, kteří chtěli tato rozhraní API používat ve Windows Serveru 2019, museli pomocí funkce Místní aplikace ICU ručně nasazovat knihovny ICU s jejich binárními soubory. Toto řešení nebylo skvělé, protože kód může být v knihovně, která nemůže řídit vynucení instalace knihoven ICU s libovolnou aplikací nebo službou, která knihovnu používá.
- Pokud je Windows Server 2019 automaticky poskytovaný cloudovou platformou (jako je Azure), nasazená služba nemusí nutně vědět, že se na takovém serveru bude spouštět. Vlastník služby také musí spravovat, jestli/kdy nasadit binární soubory ICU. Kromě toho každá služba nasazená do cloudu pomocí Windows Serveru 2019, která chce používat nová rozhraní API závislá na ICU .NET, musí nasadit binární soubory ICU se službou. To může nafoukl velikost disku na serveru.
- Někteří uživatelé ve výchozím nastavení preferují použití ICU, protože vyhovuje více standardu Unicode.
Zavedená verze
.NET 7
Doporučená akce
Pokud používáte .NET 7 ve Windows Serveru 2019 nebo windows 10 verze 1703, 1709, 1803 nebo 1809, doporučujeme před odesláním otestovat aplikaci nebo službu, aby se zajistilo, že chování bude podle očekávání a neporuší žádné uživatele.
Pokud chcete dál používat rozhraní API pro globalizaci služby NLS, můžete nastavit přepínač za běhu, který se má vrátit k požadavkům na toto chování. Další informace o dostupných přepínačích najdete v článku globalizace a ICU platformy .NET.
Ovlivněná rozhraní API
- System.Span<T>
- System.String
- Většina typů v System.Globalization oboru názvů
- System.Array.Sort (při řazení pole řetězců)
- System.Collections.Generic.List<T>.Sort() (pokud jsou prvky seznamu řetězce)
- System.Collections.Generic.SortedDictionary<TKey,TValue> (pokud jsou klíče řetězce)
- System.Collections.Generic.SortedList<TKey,TValue> (pokud jsou klíče řetězce)
- System.Collections.Generic.SortedSet<T> (pokud sada obsahuje řetězce)