Las API de globalización usan bibliotecas ICU en Windows Server 2019

.NET 7 y versiones posteriores usan bibliotecas de componentes internacionales para Unicode (ICU) para la funcionalidad de globalización cuando se ejecutan en la Windows Server 2019. Las ediciones que no son de servidor de Windows han estado usando ICU desde .NET 5. Sin embargo, .NET 7 introdujo la compatibilidad con la carga de ICU en versiones anteriores del cliente de Windows, concretamente en las versiones 1703, 1709, 1803 y 1809 de Windows 10.

Comportamiento anterior

En .NET 5 y .NET 6, las bibliotecas de .NET usan las API de compatibilidad con el idioma nacional (NLS) para la funcionalidad de globalización en Windows Server 2019. Por ejemplo, las funciones de NLS se usaban para comparar cadenas, obtener información de referencia cultural y aplicar mayúsculas y minúsculas en las cadenas en la referencia cultural adecuada. Este comportamiento también se aplica a las versiones del cliente de Windows 10, como 1703, 1709, 1803 y 1809.

Comportamiento nuevo

A partir de .NET 7, si una aplicación se ejecuta en Windows Server 2019 o Windows 10 versiones 1703, 1709, 1803 y 1809, las bibliotecas de .NET usan las API de globalización ICU de forma predeterminada. (Las versiones de Windows que no son de servidor ya han estado usando ICU desde .NET 5, por lo que no hay ningún cambio en estas versiones).

Diferencias de comportamiento

Es posible que vea cambios en la aplicación aunque no se dé cuenta de que usa las instalaciones de globalización. En el ejemplo siguiente, se muestra uno de los cambios de comportamiento que podría ver, pero también hay otros.

Símbolo de moneda

Considere el código siguiente que da formato a una cadena con el especificador de formato de divisa C. La referencia cultural del subproceso actual se establece en una referencia cultural que solo incluye el idioma, no el país o la región.

System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("de");
string text = string.Format("{0:C}", 100);
  • En .NET 5 y .NET 6 en Windows Server 2019 o versiones de cliente de Windows 10 1703, 1709, 1803 y 1809, el valor de texto es "100,00 €".
  • En .NET 7 en Windows Server 2019 o versiones de cliente de Windows 10 1703, 1709, 1803 y 1809, el valor de texto es "100,00 ¤", que usa el símbolo de moneda internacional en lugar del euro. En ICU, el diseño es que una moneda es una propiedad de un país o región, no un idioma.

Motivo del cambio

  • .NET introdujo algunas API que dependen de las bibliotecas ICU, por ejemplo, TimeZoneInfo.TryConvertIanaIdToWindowsId(String, String). Se requería a los usuarios que quisieran usar estas API en Windows Server 2019 que implementaran manualmente las bibliotecas ICU con sus archivos binarios, mediante la característica local de aplicación ICU. Esto no era una excelente solución, ya que el código puede estar en una biblioteca que no pueda controlar el forzar la instalación de las bibliotecas ICU con cualquier aplicación o servicio que use la biblioteca.
  • Si Windows Server 2019 se proporciona automáticamente mediante una plataforma en la nube (como Azure), el servicio implementado no sabe necesariamente que se va a ejecutar en este tipo de servidor. Además, el propietario del servicio tiene que administrar si va a implementar los archivos binarios de ICU y cuándo. Además, todos los servicios implementados en la nube mediante Windows Server 2019 que deseen usar las nuevas API dependientes de ICU de .NET deben implementar los archivos binarios de ICU con el servicio. Esto puede aumentar el tamaño en el disco del servidor.
  • Algunos usuarios prefieren usar ICU de manera predeterminada porque se ajusta más al estándar Unicode.

Versión introducida

.NET 7

Si usa .NET 7 en Windows Server 2019 o versiones de cliente de Windows 10 1703, 1709, 1803 o 1809, se recomienda probar la aplicación o el servicio antes de enviarlo para asegurarse de que el comportamiento sea el esperado y no interrumpa las operaciones de ningún usuario.

Si desea seguir usando las API de globalización de NLS, puede establecer un modificador en tiempo de ejecución para revertir a ese comportamiento. Para más información sobre los modificadores disponibles, consulte el artículo Globalización .NET e ICU.

API afectadas

Vea también