StringInfo と TextElementEnumerator は現在 UAX29 に準拠する

この変更の前に、System.Globalization.StringInfoSystem.Globalization.TextElementEnumerator によって一部の書記素クラスターが正しく処理されていませんでした。 一部の書記素がまとめて保持されずに、構成要素に分割されていました。 現在は、StringInfoTextElementEnumerator によって最新バージョンの Unicode 標準に従って書記素クラスターが処理されるようになりました。

また、Visual Basic 内の文字列の文字を反転する Microsoft.VisualBasic.Strings.StrReverse メソッドも、書記素クラスターの Unicode 標準に従うようになりました。

変更の説明

書記素または拡張書記素クラスターは、ユーザーが認識できる単一の文字であり、複数の Unicode コード ポイントで構成される場合があります。 たとえば、タイ語の文字 "kam" (กำ) を含む文字列は、次の 2 つの文字で構成されます。

  • ก (= '\u0e01') タイ語の文字 KO KAI
  • ำ (= '\u0e33') タイ語の文字 SARA AM

ユーザーに表示されると、オペレーティング システムではこれらの 2 つの文字が結合されて、1 つの表示文字 (書記素) "kam" (กำ) が形成されます。 また、絵文字も同様に、結合して表示する複数の文字で構成できます。

ヒント

.NET ドキュメントでは、書記素を表す際に "テキスト要素" という用語が使用されることがあります。

StringInfo クラスと TextElementEnumerator クラスによって文字列が検査され、含まれている書記素に関する情報が返されます。 .NET Framework (すべてのバージョン) および .NET Core 3.x 以前では、これらの 2 つのクラスにより、いくつかの結合クラスを処理するカスタム ロジックが使用されますが、これらのクラスは Unicode 標準に完全には準拠していません。 たとえば、StringInfo クラスと TextElementEnumerator クラスにより、1 つのタイ語の文字 "kam" がまとめて保持されずに、その構成要素に誤って分割されます。 また、これらのクラスにより、絵文字文字 "🤷🏽♀️" が 1 つの書記素クラスターとして保持されずに、4 つのクラスター (肩をすくめる人、肌色修飾子、性別修飾子、および非表示のコンバイナー) に誤って分割されます。

.NET 5 以降では、StringInfo クラスと TextElementEnumerator クラスにより、Unicode 標準の付属書 #29、リビジョン 35、セクション 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 のさまざまな機能強化の一環です。これには、.NET Core 3.0 の System.Text.Rune 型で導入された Unicode スカラー値列挙 API を補完する拡張書記素クラスター列挙 API などが含まれます。

導入されたバージョン

.NET 5.0

何らかのアクションをとる必要はありません。 アプリは、さまざまなグローバリゼーション関連のシナリオで、標準に準拠した方法で自動的に動作します。

影響を受ける API