Share via


Agora, StringInfo e TextElementEnumerator são compatíveis com UAX29

Antes dessa alteração, System.Globalization.StringInfo e System.Globalization.TextElementEnumerator não lidavam corretamente com todos os grupos de grafema. Alguns grafemas eram divididos em seus componentes constituintes em vez de serem mantidos como uma unidade. Agora, StringInfo e TextElementEnumerator processam grupos de grafema de acordo com a última versão do padrão Unicode.

Além disso, o método Microsoft.VisualBasic.Strings.StrReverse, que inverte os caracteres em uma cadeia de caracteres no Visual Basic, agora também segue o padrão Unicode para grupos de grafema.

Descrição das alterações

Um grupo de grafema ou de grafema estendido é um só caractere percebido pelo usuário que pode ser composto por vários pontos de código Unicode. Por exemplo, a cadeia de caracteres que contém o caractere tailandês "kam" (กำ) consiste nestes dois caracteres:

  • ก (= '\u0e01') THAI CHARACTER KO KAI
  • ำ (= '\u0e33') THAI CHARACTER SARA AM

Na exibição ao usuário, o sistema operacional combina os dois caracteres para formar o caractere de exibição único (ou grafema) "kam" ou กำ. O emoji também pode consistir em vários caracteres que são combinados para exibição de maneira semelhante.

Dica

A documentação do .NET às vezes usa o termo "elemento de texto" ao se referir a um grafema.

As classes StringInfo e TextElementEnumerator inspecionam as cadeias de caracteres e retornam informações sobre os grafemas que elas contêm. No .NET Framework (todas as versões) e no .NET Core 3.x e anteriores, essas duas classes usam uma lógica personalizada que lida com algumas classes de combinação, mas não está totalmente em conformidade com o padrão Unicode. Por exemplo, as classes StringInfo e TextElementEnumerator dividem incorretamente o caractere tailandês único "kam" em seus componentes constituintes em vez de mantê-los juntos. Essas classes também dividem incorretamente o caractere emoji "🤷🏽‍♀️" em quatro grupos (pessoa dando de ombros, modificador de tom de pele, modificador de gênero e um combinador invisível) em vez de mantê-los juntos como um só grupo de grafema.

Do .NET 5 em diante, as classes StringInfo e TextElementEnumerator implementam o padrão Unicode conforme a definição no Anexo do padrão Unicode nº 29, rev. 35, seq. 3. Agora eles retornam grupos de grafemas estendidos para todas as classes de combinação.

Considere o seguinte código C#:

using System.Globalization;

static void Main(string[] args)
{
    PrintGraphemes("กำ");
    PrintGraphemes("🤷🏽‍♀️");
}

static void PrintGraphemes(string str)
{
    Console.WriteLine($"Printing graphemes of \"{str}\"...");
    int i = 0;

    TextElementEnumerator enumerator = StringInfo.GetTextElementEnumerator(str);
    while (enumerator.MoveNext())
    {
        Console.WriteLine($"Grapheme {++i}: \"{enumerator.Current}\"");
    }

    Console.WriteLine($"({i} grapheme(s) total.)");
    Console.WriteLine();
}

No .NET Framework e no .NET Core 3.x e versões anteriores, os grafemas são divididos e a saída do console é a seguinte:

Printing graphemes of "กำ"...
Grapheme 1: "ก"
Grapheme 2: "ำ"
(2 grapheme(s) total.)

Printing graphemes of "🤷🏽‍♀️"...
Grapheme 1: "🤷"
Grapheme 2: "🏽"
Grapheme 3: "‍"
Grapheme 4: "♀️"
(4 grapheme(s) total.)

No .NET 5 e versões posteriores, os grafemas são mantidos juntos e a saída do console é a seguinte:

Printing graphemes of "กำ"...
Grapheme 1: "กำ"
(1 grapheme(s) total.)

Printing graphemes of "🤷🏽‍♀️"...
Grapheme 1: "🤷🏽‍♀️"
(1 grapheme(s) total.)

Além disso, do .NET 5 em diante, o método Microsoft.VisualBasic.Strings.StrReverse, que inverte os caracteres em uma cadeia de caracteres no Visual Basic, agora também segue o padrão Unicode para grupos de grafemas.

Essas alterações fazem parte de um conjunto mais amplo de aprimoramentos do Unicode e do UTF-8 no .NET, incluindo uma API de enumeração de grupos de grafemas estendida para complementar as APIs de enumeração de valor escalar Unicode, que foram introduzidos com o tipo System.Text.Rune no .NET Core 3.0.

Versão introduzida

.NET 5.0

Você não precisa realizar nenhuma ação. Os aplicativos se comportarão automaticamente de maneira mais compatível com os padrões em uma variedade de cenários relacionados à globalização.

APIs afetadas