Le API di globalizzazione usano librerie di ICU in Windows 10
.NET 5 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 10 o versioni successive.
Descrizione delle modifiche
In .NET Core 1.0 - 3.1 e .NET Framework 4 e versioni successive, le librerie .NET usano le API NLS (National Language Support) per la funzionalità di globalizzazione in Windows. 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.
A partire da .NET 5, se un'app è in esecuzione nell’aggiornamento di maggio 2019 di Windows 10 o versione successiva, le librerie .NET usano le API di globalizzazione dell'ICU , per impostazione predefinita.
Nota
L’aggiornamento di maggio 2019 di Windows 10 e versioni successive vengono forniti con la libreria nativa di ICU. Se il runtime .NET non è in grado di caricare l'ICU, usa invece NLS.
Differenze di comportamento
È possibile che vengano visualizzate modifiche nell'app anche se non ci si rende conto di usare le funzionalità di globalizzazione. Questa sezione elenca un paio di modifiche comportamentali che potrebbero essere visualizzate, ma ce ne sono anche altre.
String.IndexOf
Si consideri il codice seguente che chiama String.IndexOf(String) per trovare l'indice del carattere di nuova riga in una stringa.
string s = "Hello\r\nworld!";
int idx = s.IndexOf("\n");
Console.WriteLine(idx);
- In .NET Core 3.1 e versioni precedenti in Windows il frammento di codice stampa
6
. - In .NET 5 e nell’aggiornamento di Windows 10 di maggio 2019 e versioni successive il frammento di codice stampa
-1
. - In .NET 6 e versioni successive il frammento di codice stampa
6
, tuttavia, le librerie di ICU vengono ancora usate.
Per correggere questo codice eseguendo una ricerca ordinale anziché una ricerca sensibile alle impostazioni cultura, chiamare l'overload IndexOf(String, StringComparison) e passare a StringComparison.Ordinal come argomento.
È possibile eseguire regole di analisi del codice CA1307: Specificare StringComparison per maggiore chiarezza e CA1309: Usare stringcomparison ordinale per trovare questi siti di chiamata nel codice.
Per altre informazioni, vedere Modifiche al comportamento durante il confronto di stringhe in .NET 5+.
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 Core 3.1 e versioni precedenti in Windows il valore di testo è
"100,00 €"
. - In .NET 5 e versioni successive in Windows 19H1 e versioni successive, 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.
Abbreviazioni dei giorni della settimana
Il metodo DateTimeFormatInfo.GetShortestDayName(DayOfWeek) ottiene il nome del giorno abbreviato più corto per un giorno della settimana specificato.
- In .NET Core 3.1 e versioni precedenti in Windows, queste abbreviazioni dei giorni della settimana sono formate da due caratteri, ad esempio "Do".
- In .NET 5 e versioni successive, queste abbreviazioni dei giorni della settimana sono formate da un solo carattere, ad esempio "D".
Motivo della modifica
Questa modifica è stata introdotta per unificare . Comportamento di globalizzazione di NET in tutti i sistemi operativi supportati. Offre inoltre la possibilità per le applicazioni di aggregare le proprie librerie di globalizzazione anziché dipendere dalle librerie predefinite del sistema operativo.
Versione introdotta
.NET 5.0
Azione consigliata
Non è necessaria alcuna azione da parte dello sviluppatore. Tuttavia, se si desidera continuare a usare le API di globalizzazione NLS, è possibile impostare un commutatore di runtime per ripristinare tale comportamento. Per altre informazioni sulle opzioni disponibili, vedere l'articolo Globalizzazione .NET e ICU.
API interessate
- System.Span<T>
- System.String
- La maggior parte dei tipi nello spazio dei nomi System.Globalization
- System.Array.Sort (quando si ordina una matrice di stringhe)
- System.Collections.Generic.List<T>.Sort() (quando gli elementi dell'elenco sono stringhe)
- System.Collections.Generic.SortedDictionary<TKey,TValue> (quando le chiavi sono stringhe)
- System.Collections.Generic.SortedList<TKey,TValue> (quando le chiavi sono stringhe)
- System.Collections.Generic.SortedSet<T> (quando il set contiene stringhe)