StringInfo e TextElementEnumerator ora sono conformi a UAX29

Prima di questa modifica, System.Globalization.StringInfo e System.Globalization.TextElementEnumerator non gestivano correttamente tutti i cluster di grafemi. Alcuni grafemi sono stati suddivisi nei loro componenti costitutivi invece di essere mantenuti insieme. A questo punto StringInfo e TextElementEnumerator elaborano i cluster di grafemi in base alla versione più recente dello standard Unicode.

Inoltre, il metodo Microsoft.VisualBasic.Strings.StrReverse, che inverte i caratteri in una stringa in Visual Basic, ora segue anche lo standard Unicode per i cluster di grafemi.

Descrizione delle modifiche

Un cluster di grafemio un cluster di grafemi esteso è un singolo carattere percepito dall'utente che può essere costituito da più punti di codice Unicode. Ad esempio, la stringa contenente il carattere thai "kam" (กำ) è costituita dai due caratteri seguenti:

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

Quando viene visualizzato all'utente, il sistema operativo combina i due caratteri per formare il carattere di visualizzazione singolo (o grafema) "kam" o กำ. L’emoji può essere costituito anche da più caratteri che vengono combinati per essere visualizzati in modo simile.

Suggerimento

La documentazione di .NET usa talvolta il termine "elemento di testo" quando fa riferimento a un grafema.

Le classi StringInfo e TextElementEnumerator ispezionano le stringhe e restituiscono informazioni sui grafemi in esse contenuti. In .NET Framework (tutte le versioni) e .NET Core 3.x e versioni precedenti queste due classi utilizzano una logica personalizzata che gestisce alcune classi combinate, ma che non è completamente conforme allo standard Unicode. Ad esempio, le classi StringInfo e TextElementEnumerator suddividono erroneamente il singolo carattere thai "kam" nei suoi componenti costitutivi invece di tenerli insieme. Anche queste classi suddividono erroneamente il carattere emoji "🤷🏽‍♀️" in quattro cluster (persona che alza le spalle, modificatore del tono della pelle, modificatore di genere e combinatore invisibile) invece di tenerli insieme come un unico cluster di grafemi.

A partire da .NET 5, le classi StringInfo e TextElementEnumerator implementano lo standard Unicode come definito dallo Standard Unicode, Allegato n. 29, rev. 35, sez. 3. In particolare, ora restituiscono cluster di grafemi estesi per tutte le classi combinate.

Considerare il codice C# seguente:

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();
}

In .NET Framework e .NET Core 3.x e versioni precedenti, i grafemi vengono suddivisi e l'output della console è il seguente:

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.)

In .NET 5 e versioni successive i grafemi vengono mantenuti insieme e l'output della console è il seguente:

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

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

Inoltre, a partire da .NET 5, il metodo Microsoft.VisualBasic.Strings.StrReverse, che inverte i caratteri in una stringa di Visual Basic, ora segue anche lo standard Unicode per i cluster di grafemi.

Tali modifiche fanno parte di un set più ampio di miglioramenti Unicode e UTF-8 in .NET, inclusa un'API di enumerazione di cluster di grafemi estesa per integrare le API di enumerazione scalari Unicode introdotte con il tipo System.Text.Rune in .NET Core 3.0.

Versione introdotta

.NET 5.0

Non è necessario eseguire alcuna azione. Le app si comportano automaticamente in modo più conforme agli standard in diversi scenari correlati alla globalizzazione.

API interessate