StringInfo 和 TextElementEnumerator 现在与 UAX29 兼容
在此更改之前,System.Globalization.StringInfo 和 System.Globalization.TextElementEnumerator 无法正确处理所有字形群集。 某些字形已拆分为其构成部分,而不是合并在一起。 现在,StringInfo 和 TextElementEnumerator 将根据 Unicode 标准的最新版本处理字形群集。
此外,Microsoft.VisualBasic.Strings.StrReverse 方法(用于反转 Visual Basic 中的字符串)现在也遵循 Unicode 标准来处理字形群集。
更改描述
字形或扩展的字形群集是一个可以由多个 Unicode 码位组成的用户感知字符。 例如,包含泰文字符“kam”的字符串(กำ)由以下两个字符组成:
- ก (= '\u0e01') THAI CHARACTER KO KAI
- ำ (= '\u0e33') THAI CHARACTER SARA AM
当向用户显示时,操作系统会将这两个字符组合在一起以形成单个显示字符(或字形)“kam”或 กำ。 表情符号也可以包含以这种类似方式显示的多个组合字符。
提示
引用字形时,.NET 文档有时会使用术语“文本元素”。
StringInfo 和 TextElementEnumerator 类检查字符串并返回有关它们包含的字形信息。 在 .NET Framework(所有版本)和 .NET Core 3.x 及更早版本中,这两个类将使用自定义逻辑,这种逻辑可处理一些合并类但并不完全符合 Unicode 标准。 例如,StringInfo 和 TextElementEnumerator 类会将单个“kam”错误地拆分回其构成部分,而不是将它们合并在一起。 这些类还会将表情符号“🤷🏽♀️”错误地拆分为四个群集(人耸肩、肤色调整、性别调整和不可见组合部分),而不是将它们合并为单个字形群集。
从 .NET 5 开始,StringInfo 和 TextElementEnumerator 类可实现 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
建议操作
你不必执行任何操作。 你的应用将在各种全球化相关场景中以更符合标准的方式自动运行。