Aracılığıyla paylaş


StringInfo ve TextElementEnumerator artık UAX29 uyumlu

Bu değişiklik System.Globalization.StringInfoSystem.Globalization.TextElementEnumerator öncesinde tüm grapheme kümelerini düzgün işlemedi. Bazı grafemeler bir arada tutulmak yerine kendi bileşenlerine ayrılmıştır. StringInfo Şimdi ve TextElementEnumerator Grapheme kümelerini Unicode Standardı'nın en son sürümüne göre işleyin.

Ayrıca, Visual Basic'teki Microsoft.VisualBasic.Strings.StrReverse bir dizedeki karakterleri tersine çeviren yöntemi artık grapheme kümeleri için Unicode standardını da izler.

Açıklama değiştirildi

Grapheme veya genişletilmiş grafeme kümesi, birden çok Unicode kod noktasından oluşan, kullanıcı tarafından algılanan tek bir karakterdir. Örneğin, Tayca "kam" (กำ) karakterini içeren dize aşağıdaki iki karakterden oluşur:

  • ก (= '\u0e01') TAY KARAKTERI KO KAI
  • ำ (= '\u0e33') TAY KARAKTERI SARA AM

Kullanıcıya görüntülendiğinde, işletim sistemi iki karakteri birleştirerek tek bir görüntü karakteri (veya grapheme) "kam" veya กำoluşturur. Emojiler, benzer şekilde görüntülenmek üzere birleştirilen birden çok karakterden de oluşabilir.

İpucu

.NET belgeleri bazen grafeme başvururken "metin öğesi" terimini kullanır.

StringInfo ve TextElementEnumerator sınıfları dizeleri inceler ve içerdikleri grafemeler hakkında bilgi döndürür. .NET Framework (tüm sürümler) ve .NET Core 3.x ve önceki sürümlerinde, bu iki sınıf bazı birleştirme sınıflarını işleyen ancak Unicode Standard ile tam olarak uyumlu olmayan özel mantık kullanır. Örneğin, StringInfo ve TextElementEnumerator sınıfları tek Tayca karakteri "kam" yanlış bir şekilde onları bir arada tutmak yerine kendi bileşen bileşenlerine böler. Bu sınıflar ayrıca " " " 🤷🏽 ♀️ emoji karakterini tek bir grafeme kümesi olarak bir arada tutmak yerine yanlışlıkla dört kümeye (kişi srugging, cilt tonu değiştirici, cinsiyet değiştirici ve görünmez bir birleştirici) böler.

.NET 5'ten başlayarak ve sınıfları Unicode StringInfo Standart Ek #29, rev. 35, sn. 3 tarafından tanımlanan Unicode standardını TextElementEnumerator uygular. Özellikle, artık tüm birleştirme sınıfları için genişletilmiş grapheme kümeleri döndürmektedir.

Aşağıdaki C# kodunu göz önünde bulundurun:

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 ve .NET Core 3.x ve önceki sürümlerde grafemeler ayrılır ve konsol çıkışı aşağıdaki gibidir:

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 ve sonraki sürümlerinde grafemeler birlikte tutulur ve konsol çıkışı aşağıdaki gibidir:

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

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

Buna ek olarak, .NET 5'den başlayarak, Microsoft.VisualBasic.Strings.StrReverse Visual Basic'teki bir dizedeki karakterleri tersine çeviren yöntemi artık grapheme kümeleri için Unicode standardını da izler.

Bu değişiklikler, .NET Core 3.0'da türüyle tanıtılan Unicode skaler-value numaralandırma API'lerini tamamlayan genişletilmiş grapheme kümesi numaralandırma API'si de dahil olmak üzere .NET'teki daha geniş bir Unicode ve UTF-8 geliştirmeleri kümesinin System.Text.Rune parçasıdır.

Sürüm kullanıma sunulmuştur

.NET 5.0

Herhangi bir işlem yapmanız gerekmez. Uygulamalarınız, genelleştirmeyle ilgili çeşitli senaryolarda otomatik olarak daha standartlara uygun şekilde davranır.

Etkilenen API’ler