StringInfo 和 TextElementEnumerator 现在与 UAX29 兼容

在此更改之前,System.Globalization.StringInfoSystem.Globalization.TextElementEnumerator 无法正确处理所有字形群集。 某些字形已拆分为其构成部分,而不是合并在一起。 现在,StringInfoTextElementEnumerator 将根据 Unicode 标准的最新版本处理字形群集。

此外,Microsoft.VisualBasic.Strings.StrReverse 方法(用于反转 Visual Basic 中的字符串)现在也遵循 Unicode 标准来处理字形群集。

更改描述

字形扩展的字形群集是一个可以由多个 Unicode 码位组成的用户感知字符。 例如,包含泰文字符“kam”的字符串(กำ)由以下两个字符组成:

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

当向用户显示时,操作系统会将这两个字符组合在一起以形成单个显示字符(或字形)“kam”或 กำ。 表情符号也可以包含以这种类似方式显示的多个组合字符。

提示

引用字形时,.NET 文档有时会使用术语“文本元素”。

StringInfoTextElementEnumerator 类检查字符串并返回有关它们包含的字形信息。 在 .NET Framework(所有版本)和 .NET Core 3.x 及更早版本中,这两个类将使用自定义逻辑,这种逻辑可处理一些合并类但并不完全符合 Unicode 标准。 例如,StringInfoTextElementEnumerator 类会将单个“kam”错误地拆分回其构成部分,而不是将它们合并在一起。 这些类还会将表情符号“🤷🏽♀️”错误地拆分为四个群集(人耸肩、肤色调整、性别调整和不可见组合部分),而不是将它们合并为单个字形群集。

从 .NET 5 开始,StringInfoTextElementEnumerator 类可实现 Unicode 标准,如 Unicode 标准附录 29(修订号 35,第 3 部分)中所述。 特别是,它们现在将对所有包含类返回扩展的字形群集

考虑下列 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 开始,Microsoft.VisualBasic.Strings.StrReverse 方法(用于反转 Visual Basic 中的字符串)现在也遵循 Unicode 标准来处理字形群集。

这些更改是 .NET 中更广泛的一组 Unicode 和 UTF-8 改进的一部分,包括扩展的字形群集枚举 API,用于补充在 .NET Core 3.0 中随 System.Text.Rune 类型引入的 Unicode 标量值枚举 API。

引入的版本

.NET 5.0

你不必执行任何操作。 你的应用将在各种全球化相关场景中以更符合标准的方式自动运行。

受影响的 API