Le API di globalizzazione usano librerie di ICU in Windows Server 2019

.NET 7 e versioni successive usano librerie International Components for Unicode (ICU) per la funzionalità di globalizzazione durante l'esecuzione nell’aggiornamento di maggio 2019 di Windows Server 2019. Le edizioni non server di Windows hanno usato ICU a partire da .NET 5. .NET 7 ha introdotto tuttavia il supporto per il caricamento di ICU nelle versioni precedenti del client Windows, in particolare Windows 10 versioni 1703, 1709, 1803 e 1809.

Comportamento precedente

In .NET 5 e .NET 6 le librerie .NET usano API NLS (National Language Support) per la funzionalità di globalizzazione in Windows Server 2019. Ad esempio, le funzioni NLS sono state usate per confrontare stringhe, ottenere informazioni sulle impostazioni cultura ed eseguire maiuscole e minuscole delle stringhe nelle impostazioni cultura appropriate. Questo comportamento è applicato anche alle versioni client di Windows 10, ad esempio 1703, 1709, 1803 e 1809.

Nuovo comportamento

A partire da .NET 7, se un'app è in esecuzione in Windows Server 2019 o nel client Windows 10 versioni 1703, 1709, 1803 e 1809, per impostazione predefinita le librerie .NET usano API di globalizzazione ICU. Le versioni di Windows non server hanno già iniziato a usare ICU a partire da .NET 5, quindi non sono state apportate modifiche per queste versioni.

Differenze di comportamento

È possibile che vengano visualizzate modifiche nell'app anche se non ci si rende conto di usare le funzionalità di globalizzazione. L'esempio seguente mostra una delle modifiche comportamentali che potrebbero verificarsi, ma sono state apportate anche altre modifiche.

Simbolo di valuta

Si consideri il codice seguente che formatta una stringa usando l'identificatore C di formato valuta. Le impostazioni cultura del thread corrente sono impostate su impostazioni cultura che includono solo la lingua e non il paese o l'area geografica.

System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("de");
string text = string.Format("{0:C}", 100);
  • In .NET 5 e .NET 6 in Windows Server 2019 o nel client Windows 10 versioni 1703, 1709, 1803 e 1809 il valore di testo è "100,00 €".
  • In .NET 7 in Windows Server 2019 o nel client Windows 10 versioni 1703, 1709, 1803 e 1809 il valore di testo è "100,00 ¤", che usa il simbolo di valuta internazionale anziché l'euro. In ICU, la progettazione è che una valuta è una proprietà di un paese o di un'area geografica, non di una lingua.

Motivo della modifica

  • .NET ha introdotto alcune API che dipendono dalle librerie ICU, ad esempio TimeZoneInfo.TryConvertIanaIdToWindowsId(String, String). Gli utenti che volevano usare tali API in Windows Server 2019 erano tenuti a distribuire manualmente le librerie ICU con i relativi file binari, usando la funzionalità ICU App Local. Questa non era una soluzione ottimale, perché il codice può trovarsi in una libreria che non può controllare l'imposizione dell'installazione delle librerie ICU con qualsiasi app o servizio stia usando la libreria.
  • Se Windows Server 2019 viene fornito automaticamente da una piattaforma cloud (ad esempio Azure), il servizio distribuito non sa necessariamente che verrà eseguito in un server di questo tipo. Il proprietario del servizio deve inoltre gestire se/quando distribuire i file binari ICU. Ogni servizio distribuito nel cloud usando Windows Server 2019 che vuole usare le nuove API dipendenti da ICU per .NET deve inoltre distribuire i file binari ICU con il servizio. Ciò può aumentare le dimensioni del disco nel server.
  • Alcuni utenti preferiscono usare ICU per impostazione predefinita perché è più conforme allo standard Unicode.

Versione introdotta

.NET 7

Se si usa .NET 7 in Windows Server 2019 o nel client Windows 10 versioni 1703, 1709, 1803 o 1809, è consigliabile testare l'app o il servizio prima di spedirlo per assicurarsi che il comportamento corrisponda a quanto previsto e non provochi interruzioni per gli utenti.

Se si vuole continuare a usare le API di globalizzazione NLS, è possibile impostare un'opzione di runtime per ripristinare tale comportamento. Per altre informazioni sulle opzioni disponibili, vedere l'articolo Globalizzazione .NET e ICU.

API interessate

Vedi anche