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

.NET 7 et versions ultérieures utilisent des bibliothèques de Composants internationaux pour Unicode (ICU) pour la fonctionnalité de globalisation lors de l’exécution sur Windows Server 2019. Les éditions non serveur de Windows utilisent ICU depuis .NET 5. Toutefois, .NET 7 a introduit la prise en charge du chargement d’ICU dans les versions antérieures du client Windows, en particulier Windows 10 versions 1703, 1709, 1803 et 1809.

Comportement précédent

Dans .NET 5 et .NET 6, les bibliothèques .NET utilisaient les API NLS (National Language Support) pour la fonctionnalité de globalisation sur Windows Server 2019. 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. Ce comportement s’applique également aux versions du client Windows 10, telles que 1703, 1709, 1803 et 1809.

Nouveau comportement

À compter de .NET 7, si une application s’exécute sur Windows Server 2019 ou le client Windows 10 versions 1703, 1709, 1803 et 1809, les bibliothèques .NET utilisent les API de globalisation ICU par défaut. (Les versions Windows non serveur utilisent déjà ICU depuis .NET 5. Il n’y a donc aucun changement pour ces versions.)

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. L’exemple suivant montre l’un des changements de comportement que vous pourriez voir, mais il en existe également d’autres.

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 5 et .NET 6 sur Windows Server 2019 ou le client Windows 10 versions 1703, 1709, 1803 et 1809, la valeur du texte est "100,00 €".
  • Dans .NET 7 sur Windows Server 2019 ou le client Windows 10 versions 1703, 1709, 1803 et 1809, la valeur du texte est "100,00 ¤", qui utilise le symbole de devise 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

  • .NET a introduit certaines API qui dépendent de bibliothèques ICU, par exemple TimeZoneInfo.TryConvertIanaIdToWindowsId(String, String). Les utilisateurs qui voulaient utiliser ces API sur Windows Server 2019 devaient déployer manuellement des bibliothèques ICU avec leurs fichiers binaires, à l’aide de la fonctionnalité ICU App Local. Ce n’était pas une solution idéale, car le code peut se trouver dans une bibliothèque qui ne peut pas contrôler l’installation forcée des bibliothèques d’ICU avec l’application ou le service qui utilise la bibliothèque.
  • Si Windows Server 2019 est automatiquement fourni par une plateforme cloud (comme Azure), le service déployé ne sait pas nécessairement qu’il va s’exécuter sur un tel serveur. En outre, le propriétaire du service doit gérer si/quand déployer des binaires ICU. En outre, chaque service déployé dans le cloud à l’aide de Windows Server 2019 qui souhaite utiliser les nouvelles API .NET dépendantes d’ICU doit déployer les binaires ICU avec le service. Cela peut gonfler la taille du disque sur le serveur.
  • Certains utilisateurs préfèrent utiliser ICU par défaut, car cela est plus conforme à la norme Unicode.

Version introduite

.NET 7

Si vous utilisez .NET 7 sur Windows Server 2019 ou le client Windows 10 versions 1703, 1709, 1803 et 1809, nous recommandons de tester votre application ou service avant de l’expédier pour vous assurer que le comportement est celui prévu et n’interrompt aucun utilisateur.

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