APIs de globalização usam bibliotecas de UTI no Windows 10
O .NET 5 e versões posteriores usam bibliotecas International Components for Unicode (ICU) para funcionalidade de globalização quando executadas no Windows 10 May 2019 Update ou posterior.
Alterar a descrição
No .NET Core 1.0 - 3.1 e no .NET Framework 4 e posterior, as bibliotecas .NET usam APIs NLS (National Language Support) para a funcionalidade de globalização no Windows. Por exemplo, as funções NLS foram usadas para comparar cadeias de caracteres, obter informações de cultura e executar invólucros de cadeia de caracteres na cultura apropriada.
A partir do .NET 5, se um aplicativo estiver sendo executado no Windows 10 May 2019 Update ou posterior, as bibliotecas do .NET usam APIs de globalização da ICU , por padrão.
Nota
O Windows 10 May 2019 Update e versões posteriores são fornecidos com a biblioteca nativa da UTI. Se o tempo de execução do .NET não puder carregar a UTI, ele usará NLS.
Diferenças comportamentais
Você pode ver alterações em seu aplicativo mesmo que não perceba que está usando recursos de globalização. Esta seção lista algumas das mudanças comportamentais que você pode ver, mas há outras também.
String.IndexOf
Considere o código a seguir que chama String.IndexOf(String) para localizar o índice do caractere de nova linha em uma cadeia de caracteres.
string s = "Hello\r\nworld!";
int idx = s.IndexOf("\n");
Console.WriteLine(idx);
- No .NET Core 3.1 e versões anteriores no Windows, o trecho é
6
impresso . - No .NET 5 e no Windows 10 May 2019 Update e versões posteriores, o trecho é
-1
impresso . - No .NET 6 e versões posteriores, as impressões de trechos ,
6
no entanto, as bibliotecas de UTI ainda são usadas.
Para corrigir esse código conduzindo uma pesquisa ordinal em vez de uma pesquisa sensível à cultura, chame a IndexOf(String, StringComparison) sobrecarga e passe StringComparison.Ordinal como um argumento.
Você pode executar regras de análise de código CA1307: Especifique StringComparison para maior clareza e CA1309: Use ordinal StringComparison para localizar esses sites de chamada em seu código.
Para obter mais informações, consulte Alterações de comportamento ao comparar cadeias de caracteres no .NET 5+.
Símbolo de moeda
Considere o código a seguir que formata uma cadeia de caracteres usando o especificador C
de formato de moeda . A cultura do segmento atual é definida como uma cultura que inclui apenas o idioma e não o país ou região.
System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("de");
string text = string.Format("{0:C}", 100);
- No .NET Core 3.1 e versões anteriores no Windows, o valor do texto é
"100,00 €"
. - No .NET 5 e versões posteriores no Windows 19H1 e versões posteriores, o valor do texto é
"100,00 ¤"
, que usa o símbolo de moeda internacional em vez do euro. Na UTI, o design é que uma moeda é uma propriedade de um país ou região, não um idioma.
Abreviaturas do dia da semana
O DateTimeFormatInfo.GetShortestDayName(DayOfWeek) método obtém o nome de dia abreviado mais curto para um dia especificado da semana.
- No .NET Core 3.1 e versões anteriores no Windows, essas abreviaturas de dia da semana consistiam em dois caracteres, por exemplo, "Su".
- No .NET 5 e versões posteriores, essas abreviaturas de dia da semana consistem em apenas um caractere, por exemplo, "S".
Razão para a alteração
Esta alteração foi introduzida para unificar. O comportamento de globalização da NET em todos os sistemas operacionais suportados. Ele também fornece a capacidade de os aplicativos agruparem suas próprias bibliotecas de globalização em vez de depender das bibliotecas internas do sistema operacional.
Versão introduzida
.NET 5.0
Ação recomendada
Nenhuma ação é necessária por parte do desenvolvedor. No entanto, se desejar continuar usando APIs de globalização NLS, você pode definir uma opção de tempo de execução para reverter para esse comportamento. Para obter mais informações sobre as opções disponíveis, consulte o artigo Globalização e UTI do .NET.
APIs afetadas
- System.Span<T>
- System.String
- A maioria dos tipos no System.Globalization namespace
- System.Array.Sort (ao classificar uma matriz de cadeias de caracteres)
- System.Collections.Generic.List<T>.Sort() (quando os elementos da lista são strings)
- System.Collections.Generic.SortedDictionary<TKey,TValue> (quando as teclas são strings)
- System.Collections.Generic.SortedList<TKey,TValue> (quando as teclas são strings)
- System.Collections.Generic.SortedSet<T> (quando o conjunto contém strings)