Udostępnij za pośrednictwem


StringInfo i TextElementEnumerator są teraz zgodne ze standardem UAX29

Przed tą zmianą System.Globalization.StringInfo i System.Globalization.TextElementEnumerator nie obsłużyła poprawnie wszystkich klastrów grafu. Niektóre grafemy zostały podzielone na ich składniki składowe, zamiast być przechowywane razem. StringInfo Teraz i TextElementEnumerator przetwarzaj klastry grapheme zgodnie z najnowszą wersją standardu Unicode.

Ponadto Microsoft.VisualBasic.Strings.StrReverse metoda, która odwraca znaki w ciągu w Visual Basic, teraz jest również zgodna ze standardem Unicode dla klastrów grapheme.

Opis zmiany

Klaster grafeme lub rozszerzony grafeme to pojedynczy znak postrzegany przez użytkownika, który może składać się z wielu punktów kodu Unicode. Na przykład ciąg zawierający tajlandzki znak "kam" (กำ) składa się z następujących dwóch znaków:

  • ก (= '\u0e01') TAJLANDZKA POSTAĆ KO KAI
  • ำ (= '\u0e33') TAJLANDZKA POSTAĆ SARA AM

Po wyświetleniu użytkownikowi system operacyjny łączy dwa znaki w celu utworzenia pojedynczego znaku wyświetlanego (lub grafu) "kam" lub กำ. Emoji może również składać się z wielu znaków połączonych do wyświetlania w podobny sposób.

Napiwek

Dokumentacja platformy .NET czasami używa terminu "element tekstowy" podczas odwoływania się do grafu.

Klasy StringInfo i TextElementEnumerator sprawdzają ciągi i zwracają informacje o grafach, które zawierają. W programach .NET Framework (wszystkie wersje) i .NET Core 3.x i starszych tych dwóch klas używa logiki niestandardowej, która obsługuje niektóre połączone klasy, ale nie jest w pełni zgodna ze standardem Unicode. Na przykład StringInfo klasy i TextElementEnumerator niepoprawnie podzielić pojedynczy tajlandzki znak "kam" z powrotem na jego składniki składowe, zamiast utrzymywać je razem. Te klasy również niepoprawnie podzielić znak emoji " na 🤷🏽 ♀️ cztery klastry (osoba wzruszająca ramionami, modyfikator tonu skóry, modyfikator płci i niewidoczny kombinator) zamiast utrzymywać je razem jako pojedynczy klaster grafeme.

Począwszy od platformy .NET 5, StringInfo klasy i TextElementEnumerator implementują standard Unicode zgodnie z definicją w załączniku Standard Unicode nr 29, rev. 35, s. 3. W szczególności zwracają one teraz rozszerzone klastry grafeme dla wszystkich połączonych klas.

Rozważmy następujący kod w języku 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();
}

W programach .NET Framework i .NET Core 3.x i starszych wersjach wykresy są podzielone, a dane wyjściowe konsoli są następujące:

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

W wersjach platformy .NET 5 i nowszych wykresy są przechowywane razem, a dane wyjściowe konsoli są następujące:

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

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

Ponadto, począwszy od platformy .NET 5, metoda, Microsoft.VisualBasic.Strings.StrReverse która odwraca znaki w ciągu w języku Visual Basic, teraz jest również zgodna ze standardem Unicode dla klastrów grapheme.

Te zmiany są częścią szerszego zestawu ulepszeń unicode i UTF-8 na platformie .NET, w tym rozszerzonego interfejsu API wyliczania klastra grafeme w celu uzupełnienia interfejsów API wyliczania wartości skalarnej Unicode, które zostały wprowadzone z System.Text.Rune typem na platformie .NET Core 3.0.

Wprowadzona wersja

.NET 5.0

Nie musisz podejmować żadnych działań. Aplikacje będą automatycznie zachowywać się w bardziej zgodny ze standardami sposób w różnych scenariuszach związanych z globalizacją.

Dotyczy interfejsów API