AS APIs de globalização usam bibliotecas de ICU no Windows 10
O .NET 5 e versões posteriores usam bibliotecas de Componentes Internacionais para Unicode (UTI) para funcionalidade de globalização ao serem executadas em Atualização de maio de 2019 para o Windows 10 ou posterior.
Descrição das alterações
No .NET Core 1.0 – 3.1 e .NET Framework 4 e posteriores, as bibliotecas do .NET usam APIs do NLS (National Language Support) para 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 maiúsculas e minúsculas de cadeia de caracteres na cultura apropriada.
A partir do .NET 5, se um aplicativo estiver em execução no Atualização de maio de 2019 para o Windows 10 ou posterior, as bibliotecas .NET usarão APIs de globalização da ICU, por padrão.
Observação
Atualização de maio de 2019 para o Windows 10 e versões posteriores são enviadas com a biblioteca nativa da ICU. Se o runtime do .NET não puder carregar a ICU, ele usará o NLS.
Diferenças de comportamento
Você pode ver alterações em seu aplicativo mesmo que não perceba que está usando instalações de globalização. Esta seção lista algumas das alterações 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 snippet imprime
6
. - No .NET 5 e na atualização de maio de 2019 para o Windows 10 e versões posteriores, o snippet imprime
-1
. - No .NET 6 e versões posteriores, o snippet imprime
6
, no entanto, as bibliotecas de ICU ainda são usadas.
Para corrigir esse código realizando uma pesquisa ordinal em vez de uma pesquisa sensível à cultura, chame a sobrecarga IndexOf(String, StringComparison) e passe StringComparison.Ordinal como um argumento.
Você pode executar as regras de análise de código CA1307: especifique StringComparison para clareza e CA1309: use o StringComparison ordinal para encontrar 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 de formato de moeda C
. A cultura do thread 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 ICU, o design é que uma moeda é uma propriedade de um país ou região, não um idioma.
Abreviações de dia da semana
O método DateTimeFormatInfo.GetShortestDayName(DayOfWeek) obtém o nome do dia abreviado mais curto para um dia da semana especificado.
- No .NET Core 3.1 e em versões anteriores no Windows, essas abreviações dos dias da semana consistiam em dois caracteres, por exemplo, "Do".
- No .NET 5 e em versões posteriores, essas abreviações de dia da semana consistem em apenas um caractere, por exemplo, "D".
Motivo da alteração
Essa alteração foi introduzida para unificar o comportamento de globalização do .NET em todos os sistemas operacionais com suporte. Ele também fornece a capacidade dos aplicativos de agrupar 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 você quiser continuar usando APIs de globalização do NLS, poderá 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 sobre globalização e ICU do .NET .
APIs afetadas
- System.Span<T>
- System.String
- A maioria dos tipos no namespace System.Globalization
- System.Array.Sort (ao classificar uma matriz de cadeias de caracteres)
- System.Collections.Generic.List<T>.Sort() (quando os elementos da lista são cadeias de caracteres)
- System.Collections.Generic.SortedDictionary<TKey,TValue> (quando as chaves são cadeias de caracteres)
- System.Collections.Generic.SortedList<TKey,TValue> (quando as chaves são cadeias de caracteres)
- System.Collections.Generic.SortedSet<T> (quando o conjunto contém cadeias de caracteres)