StringInfo 與 TextElementEnumerator 現在符合 UAX29 規範

在此變更之前,System.Globalization.StringInfoSystem.Globalization.TextElementEnumerator 不會正確處理所有字素叢集。 有些圖形會分割成組成元件,而不是一起保留。 現在,StringInfoTextElementEnumerator 會根據 Unicode 標準的最新版本處理字素叢集。

此外,會在 Visual Basic 中反轉字串中字元的 Microsoft.VisualBasic.Strings.StrReverse 方法,現在也會針對字素叢集遵循 Unicode 標準。

變更描述

字素延伸字素叢集是單一使用者感知字元,可能由多個 Unicode 字碼指標所組成。 舉例來說,包含泰文字元 "kam" (กำ) 的字串便由以下兩個字元組成:

  • ก (= '\u0e01') THAI CHARACTER KO KAI
  • ำ (= '\u0e33') THAI CHARACTER SARA AM

向使用者顯示時,作業系統會結合這兩個字元,以形成單一顯示字元 (或字素) "kam" or กำ。 Emoji 也可以由多個字元組成,這些字元會以類似的方式組合顯示。

提示

稱呼字素時,.NET 文件有時候會使用「文字元素」一詞。

StringInfoTextElementEnumerator 類別會檢查字串,並傳回有關字串所包含字素的資訊。 在 .NET Framework (所有版本) 和 .NET Core 3.x 和舊版中,這兩個類別會使用自訂邏輯來處理一些合併類別,但不完全符合 Unicode 標準規範。 舉例來說StringInfoTextElementEnumerator 類別會錯誤地將單一泰文字元 "kam" 分割回其組成元件,而不是將它們保持在一起。 這些類別也會不正確地將 Emoji 字元 "🤷🏽‍♀️" 分割到四個叢集 (聳肩的人、膚色修飾詞、性別修飾詞以及不可見的結合器),而不是將它們保持在一起成為字素叢集。

從 .NET 5 開始,StringInfoTextElementEnumerator 類別會實作由 Unicode 標準 Annex #29、rev. 35、sec. 3定義的 Unicode 標準。 特別來說,它們現在會針對所有合併的類別傳回延伸字素叢集

請考量下列 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();
}

在 .NET Framework 和 .NET Core 3.x 和舊版中,字素會受到分割,且主控台輸出如下所示:

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

在 .NET 5 和更新版本中,字素會保留在一起,且主控台輸出如下所示:

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

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

此外,從 .NET 5 開始,會在 Visual Basic 中反轉字串中字元的 Microsoft.VisualBasic.Strings.StrReverse 方法,現在也會針對字素叢集遵循 Unicode 標準。

這些變更屬於 .NET 中 Unicode 和 UTF-8 眾多改善的一環,其中包含字素叢集列舉 API 來補足隨 .NET Core 3.0 System.Text.Rune 類型引進的 Unicode 純量值列舉 API。

導入的版本

.NET 5.0

您不需要採取任何動作。 您的應用程式會在各種全球化相關案例中,以更符合標準的方式自動運作。

受影響的 API