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. Teraz StringInfo i TextElementEnumerator przetwarzają klastry grafemowe 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.

Zmień opis

Grafem lub klaster rozszerzonego grafemu to znak postrzegany jako pojedynczy przez użytkownika, który może składać się z wielu punktów kodowych 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.

Wskazówka

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 klasy StringInfo i TextElementEnumerator niepoprawnie dzielą tajski znak "kam" na jego składniki, zamiast pozostawiać go w całości. Te klasy również niepoprawnie podzieliły znak emoji "🤷🏽‍♀️" na cztery klastry (osoba wzruszająca ramionami, modyfikator koloru skóry, modyfikator płci i niewidoczny łącznik) zamiast utrzymać je razem jako pojedynczy klaster grafemowy.

Począwszy od platformy .NET 5, klasy StringInfo i TextElementEnumerator implementują standard Unicode zgodnie z definicją w Załączniku Standardu Unicode nr 29, rev. 35, sekcja 3. W szczególności teraz zwracają rozszerzone klastry grafemów dla wszystkich klas łączących.

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 znaków w Visual Basic, teraz jest również zgodna ze standardem Unicode dla klastrów graficznych.

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

Wersja wprowadzona

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

Interfejsy API, których dotyczy problem