StringInfo と TextElementEnumerator は現在 UAX29 に準拠する
この変更の前に、System.Globalization.StringInfo と System.Globalization.TextElementEnumerator によって一部の書記素クラスターが正しく処理されていませんでした。 一部の書記素がまとめて保持されずに、構成要素に分割されていました。 現在は、StringInfo と TextElementEnumerator によって最新バージョンの 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
.NET
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示