Les API de globalisation utilisent des bibliothèques ICU sur Windows 10

.NET 5 et versions ultérieures utilisent des bibliothèques Composants internationaux pour Unicode (ICU) pour la fonctionnalité de globalisation lors de l’exécution sur la mise à jour de mai 2019 Windows 10 ou version ultérieure.

Description de la modification

Dans .NET 1.0 - 3.1 et .NET Framework 4 et version ultérieure, les bibliothèques .NET utilisaient les API NLS (National Language Support) pour la fonctionnalité de globalisation sur Windows. Par exemple, les fonctions NLS étaient utilisées pour comparer des chaînes, obtenir des informations de culture et effectuer la casse de chaîne dans la culture appropriée.

À compter de .NET 5, si une application s’exécute sur la mise à jour de mai 2019 de Windows 10 ou une version ultérieure, les bibliothèques .NET utilisent par défaut les API de globalisation ICU.

Notes

La mise à jour de mai 2019 de Windows 10 et versions ultérieures sont livrées avec la bibliothèque native ICU. Si le runtime .NET ne peut pas charger l’ICU, il utilise NLS à la place.

Différences de comportement

Vous pourriez voir des modifications dans votre application même si vous ne réalisez pas que vous utilisez des fonctionnalités de globalisation. Cette section répertorie l’un des changements de comportement que vous pourriez voir, mais il en existe également d’autres.

String.IndexOf

Examinez le code suivant qui appelle String.IndexOf(String) pour rechercher l’index du caractère nouvelle ligne dans une chaîne.

string s = "Hello\r\nworld!";
int idx = s.IndexOf("\n");
Console.WriteLine(idx);
  • Dans .NET Core 3.1 et les versions antérieures sur Windows, l’extrait de code affiche 6.
  • Dans .NET 5 et sur la mise à jour de mai 2019 de Windows 10 et versions ultérieures, l’extrait de code imprime -1.
  • Dans .NET 6 et versions ultérieures, l’extrait de code imprime 6, cependant, les bibliothèques ICU sont toujours utilisées.

Pour corriger ce code en effectuant une recherche ordinale au lieu d’une recherche sensible à la culture, appelez la surcharge IndexOf(String, StringComparison) et transmettez-la à StringComparison.Ordinal en tant qu’argument.

Vous pouvez exécuter des règles d’analyse du code CA1307 : Spécifier StringComparison pour la clarté et CA1309 : Utilisez stringComparison ordinal pour rechercher ces sites d’appel dans votre code.

Pour plus d’informations, consultez Changements de comportement lors de la comparaison de chaînes sur .NET 5+.

Symbole monétaire

Considérez le code suivant qui met en forme une chaîne à l’aide du spécificateur de format de devise C. La culture du thread actuel est définie sur une culture qui inclut uniquement la langue et non le pays ou la région.

System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("de");
string text = string.Format("{0:C}", 100);
  • Dans .NET Core 3.1 et les versions antérieures sur Windows, la valeur du texte est "100,00 €".
  • Dans .NET 5 et versions ultérieures sur Windows 19H1 et versions ultérieures, la valeur du texte est "100,00 ¤" et utilise le symbole monétaire international au lieu de l’euro. Dans ICU, la conception est qu’une devise est une propriété d’un pays ou d’une région, et non d’une langue.

Raison de la modification

Ce changement a été introduit pour unifier le comportement de globalisation de .NET sur tous les systèmes d’exploitation pris en charge. Il permet également aux applications de grouper leurs propres bibliothèques de globalisation plutôt que de dépendre des bibliothèques intégrées du système d’exploitation.

Version introduite

.NET 5.0

Aucune action n’est requise de la part du développeur. Si vous souhaitez continuer à utiliser les API de globalisation NLS, vous pouvez définir un commutateur à l’exécution pour revenir à ce comportement. Pour plus d’informations sur les commutateurs disponibles, consultez l’article Globalisation et ICU de .NET.

API affectées

Voir aussi