Condividi tramite


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 culturali e modificare le maiuscole e le minuscole delle stringhe nelle impostazioni culturali 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 su 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 alla cultura, chiamare l'overload IndexOf(String, StringComparison) e passarlo come argomento in StringComparison.Ordinal.

È 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 Procedure consigliate per il confronto di stringhe in .NET.

Simbolo di valuta

Si consideri il codice seguente che formatta una stringa usando l'identificatore C di formato valuta. La cultura del thread corrente è impostata su una cultura che include solo la lingua e non il paese o la regione.

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.

IdnMapping.GetAscii

Si consideri il codice seguente che chiama IdnMapping.GetAscii(String) per convertire un'etichetta di nome di dominio internazionalizzata nella codifica compatibile con ASCII.

var mapping = new System.Globalization.IdnMapping();
string asciiName = mapping.GetAscii("ABCDEFG");
Console.WriteLine(asciiName);
  • In .NET Core 3.1 e versioni precedenti su Windows, il frammento di codice stampa ABCDEFG.
  • In .NET 5 e versioni successive in Windows 10 maggio 2019 Update e versioni successive il frammento di codice stampa abcdefg.

ICU applica le minuscole alle etichette dei nomi di dominio come parte del processo di codifica compatibile con ASCII. NLS non converte in minuscolo le etichette che non contengono caratteri internazionali, quindi viene mantenuta la formattazione originale delle lettere.

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 su Windows, queste abbreviazioni dei giorni della settimana erano 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 il 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

Non è necessaria alcuna azione da parte dello sviluppatore. Tuttavia, se si desidera 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