Compartir vía


Las API de globalización usan bibliotecas de ICU en Windows 10.

.NET 5 y versiones posteriores usan bibliotecas de componentes internacionales para Unicode (ICU) para la funcionalidad de globalización cuando se ejecutan en la actualización de mayo de 2019 de Windows 10 o versiones posteriores.

Descripción del cambio

En .NET Core 1.0 a 3.1 y .NET Framework 4 y versiones posteriores, las bibliotecas de .NET usan las API de compatibilidad con el idioma nacional (NLS) para la funcionalidad de globalización en Windows. 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.

A partir de .NET 5, si una aplicación se ejecuta en la actualización de mayo de 2019 de Windows 10 o posterior, las bibliotecas de .NET usan las API de globalización de ICU de manera predeterminada.

Nota:

Las versiones de la actualización de mayo de 2019 de Windows 10 o posteriores incluyen la biblioteca nativa de ICU. Si el tiempo de ejecución de .NET no puede cargar ICU, utilizará NLS en su lugar.

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 esta sección se enumeran algunos de los cambios de comportamiento que podría ver, pero también hay otros.

String.IndexOf

Considere el código siguiente que llama a String.IndexOf(String) para buscar el índice del carácter de nueva línea en una cadena.

string s = "Hello\r\nworld!";
int idx = s.IndexOf("\n");
Console.WriteLine(idx);
  • En .NET Core 3.1 y versiones anteriores en Windows, el fragmento de código imprime 6.
  • En .NET 5 y en la actualización del 10 de mayo de 2019 de Windows y versiones posteriores, el fragmento de código imprime -1.
  • En .NET 6 y versiones posteriores, el fragmento de código imprime 6, sin embargo, las bibliotecas de ICU aún se usan.

Para corregir este código mediante la realización de una búsqueda ordinal en lugar de una búsqueda según la referencia cultural, llame a la sobrecarga IndexOf(String, StringComparison) y pase StringComparison.Ordinal como argumento.

Puede ejecutar las reglas de análisis de código CA1307: Especificar StringComparison para mayor claridad y CA1309: Usar StringComparison ordinal para buscar estos sitios de llamada en el código.

Para más información, consulte Cambios de comportamiento al comparar cadenas en .NET 5 +.

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 Core 3.1 y versiones anteriores en Windows, el valor del texto es "100,00 €".
  • En .NET 5 y versiones posteriores en Windows 19H1 y versiones posteriores, el valor del 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

Este cambio se presentó para unificar el comportamiento de globalización de .NET en todos los sistemas operativos compatibles. También ofrece la posibilidad de que las aplicaciones agrupen sus propias bibliotecas de globalización en lugar de depender de las bibliotecas integradas del sistema operativo.

Versión introducida

.NET 5.0

No se requiere ninguna acción por parte del desarrollador. Sin embargo, 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