Sdílet prostřednictvím


StringInfo a TextElementEnumerator jsou teď kompatibilní s UAX29

Před touto změnou System.Globalization.StringInfoSystem.Globalization.TextElementEnumerator a nezpracoval správně všechny clustery grafeme. Některé grafy byly rozděleny do jejich základních součástí, místo aby byly pohromadě. StringInfo Nyní a TextElementEnumerator zpracování clusterů grapheme podle nejnovější verze Unicode Standard.

Kromě toho Microsoft.VisualBasic.Strings.StrReverse metoda, která obrátí znaky v řetězci v jazyce Visual Basic, nyní také dodržuje standard Unicode pro clustery grapheme.

Změna popisu

Grafeme nebo rozšířený cluster grapheme je jeden uživatelem vnímaný znak, který může být tvořen několika body kódu Unicode. Například řetězec obsahující thajský znak "kam" (กำ) se skládá z následujících dvou znaků:

  • ก (= '\u0e01') THAJSKÝ ZNAK KO KAI
  • ำ (= '\u0e33') THAJSKÝ ZNAK SARA AM

Při zobrazení uživateli operační systém kombinuje dva znaky, aby vytvořil jeden znak zobrazení (nebo grapheme) "kam" nebo กำ. Emoji se také může skládat z více znaků, které jsou sloučeny pro zobrazení podobným způsobem.

Tip

Dokumentace k .NET někdy používá termín "textový prvek" při odkazech na grapheme.

TextElementEnumerator Třídy StringInfo kontrolují řetězce a vrací informace o grafech, které obsahují. V rozhraní .NET Framework (všechny verze) a .NET Core 3.x a starší používají tyto dvě třídy vlastní logiku, která zpracovává některé kombinační třídy, ale plně nevyhovuje standardu Unicode. Například StringInfo třídy nesprávně TextElementEnumerator rozdělují jeden thajský znak "kam" zpět do jeho základních součástí, místo aby je udržovaly pohromadě. Tyto třídy také nesprávně rozdělují znak emoji " 🤷🏽 ♀️ " na čtyři shluky (osoba shrugging, skin tón modifikátor, pohlaví modifikátor a neviditelný kombinátor) místo toho, aby byly pohromadě jako jeden grafeme cluster.

Počínaje .NET 5 StringInfo implementují a TextElementEnumerator třídy standard Unicode definovaný standardem Unicode příloha č. 29, rev. 35, s. 3. Konkrétně teď vracejí rozšířené clustery grafeme pro všechny kombinační třídy.

Vezměte v úvahu následující kód jazyka 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();
}

V rozhraní .NET Framework a .NET Core 3.x a starších verzích jsou grafy rozdělené a výstup konzoly je následující:

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

V .NET 5 a novějších verzích se grafy uchovávají společně a výstup konzoly je následující:

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

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

Kromě toho, počínaje v .NET 5, Microsoft.VisualBasic.Strings.StrReverse metoda, která obrátí znaky v řetězci v jazyce Visual Basic, nyní také dodržuje standard Unicode pro clustery grapheme.

Tyto změny jsou součástí širší sady vylepšení Unicode a UTF-8 v .NET, včetně rozšířeného rozhraní API výčtu clusteru grapheme, které doplňují rozhraní API pro výčet skalárních hodnot Unicode, která byla zavedena s typem System.Text.Rune v .NET Core 3.0.

Zavedená verze

.NET 5.0

Nemusíte nic dělat. Vaše aplikace se budou automaticky chovat více standardově vyhovujícím způsobem v různých scénářích souvisejících s globalizací.

Ovlivněná rozhraní API