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.
Abreviaturas del día de la semana
El método DateTimeFormatInfo.GetShortestDayName(DayOfWeek) obtiene el nombre de día abreviado más corto para un día especificado de la semana.
- En .NET Core 3.1 y versiones anteriores de Windows, estas abreviaturas diarias de semana constan de dos caracteres, por ejemplo, "Su".
- En .NET 5 y versiones posteriores, estas abreviaturas de día de semana constan de solo un carácter, por ejemplo, "S".
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
Acción recomendada
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
- System.Span<T>
- System.String
- La mayoría de tipos del espacio de nombres System.Globalization
- System.Array.Sort (al ordenar una matriz de cadenas)
- System.Collections.Generic.List<T>.Sort() (cuando los elementos de lista son cadenas)
- System.Collections.Generic.SortedDictionary<TKey,TValue> (cuando las claves son cadenas)
- System.Collections.Generic.SortedList<TKey,TValue> (cuando las claves son cadenas)
- System.Collections.Generic.SortedSet<T> (cuando el conjunto contiene cadenas)