StringInfo und TextElementEnumerator jetzt mit UAX29 kompatibel

Vor dieser Änderung haben System.Globalization.StringInfo und System.Globalization.TextElementEnumerator nicht alle Graphemhaufen ordnungsgemäß verarbeitet. Einige Grapheme wurden nicht als Ganzes beibehalten, sondern in ihre Bestandteile aufgeteilt. Nun verarbeiten StringInfo und TextElementEnumerator Graphemhaufen der aktuellen Version des Unicode-Standards entsprechend.

Außerdem folgt die Microsoft.VisualBasic.Strings.StrReverse-Methode, die die Zeichen in einer Zeichenfolge in Visual Basic umkehrt, nun auch dem Unicode-Standard für Graphemhaufen.

Änderungsbeschreibung

Bei einem Graphem oder erweiterten Graphemhaufen handelt es sich um ein vom Benutzer als Einzelzeichen wahrgenommenes Zeichen, das aus mehreren Unicode-Codepunkten bestehen kann. Die Zeichenfolge, die das Thai-Zeichen „kam“ (กำ) enthält, besteht beispielsweise aus den folgenden beiden Zeichen:

  • (= '\u0e01') THAI-ZEICHEN KO KAI
  • (= '\u0e33') THAI-Zeichen SARA AM

Wenn diese dem Benutzer angezeigt werden, kombiniert das Betriebssystem die beiden Zeichen und formt das angezeigte Einzelzeichen (oder Graphem) „kam“ oder กำ. Auch Emojis können aus mehreren Zeichen bestehen, die auf ähnliche Weise kombiniert werden, bevor sie angezeigt werden.

Tipp

In der .NET-Dokumentation wird manchmal der Begriff „Textelement“ verwendet, wenn Grapheme gemeint sind.

Die Klassen StringInfo und TextElementEnumerator untersuchen Zeichenfolgen und geben Informationen zu den darin enthaltenen Graphemen zurück. In .NET Framework (alle Versionen) und .NET Core 3.x und früher verwenden diese beiden Klassen eine benutzerdefinierte Logik, die einige kombinierte Klassen verarbeitet, aber nicht vollständig mit dem Unicode-Standard konform ist. Beispielsweise teilen die Klassen StringInfo und TextElementEnumerator fälschlicherweise das Thai-Einzelzeichen „kam“ wieder in seine Bestandteile auf, anstatt diese zu kombinieren. Diese Klassen teilen auch fälschlicherweise das Emoji-Zeichen „🤷🏽 ♀️“ in vier Bestandteile auf (achselzuckende Person, Hautfarbenmodifizierer, Geschlechtsmodifizierer, unsichtbarer Combiner), anstatt es als einen einzelnen Graphemhaufen zu speichern.

Ab .NET 5 implementieren die Klassen StringInfo und TextElementEnumerator den Unicode-Standard, der im Unicode® Standard Annex #29 (Revision 35, Abschnitt 3) definiert ist. Insbesondere werden nun erweiterte Graphemhaufen für alle kombinierenden Klassen zurückgegeben.

Sehen Sie sich folgenden C#-Code an:

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 und .NET Core 3.x und früheren Versionen werden die Grapheme aufgeteilt, und die Konsolenausgabe sieht wie folgt aus:

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 und höheren Versionen werden die Grapheme zusammengehalten, und die Konsolenausgabe sieht wie folgt aus:

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

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

Außerdem folgt die Microsoft.VisualBasic.Strings.StrReverse-Methode, die die Zeichen in einer Zeichenfolge in Visual Basic umkehrt, ab .NET 5 auch dem Unicode-Standard für Graphemhaufen.

Diese Änderungen sind Teil umfangreicher Verbesserungen von Unicode und UTF-8 in .NET, die auch eine Enumerations-API für erweiterte Graphemhaufen umfassen, um die Enumerations-APIs für Unicode-Skalarwerte zu ergänzen, die mit dem System.Text.Rune-Typ in .NET Core 3.0 eingeführt wurden.

Eingeführt in Version

.NET 5.0

Sie müssen keine Maßnahmen ergreifen. Ihre Apps verhalten sich in vielen Globalisierungsszenarios automatisch standardkonformer.

Betroffene APIs