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