Bagikan melalui


StringInfo dan TextElementEnumerator sekarang mematuhi UAX29

Sebelum perubahan ini, System.Globalization.StringInfo dan System.Globalization.TextElementEnumerator tidak menangani semua kluster grapheme dengan benar. Beberapa graphem dibagi menjadi komponen konstituennya alih-alih disimpan bersama. Sekarang, StringInfo dan TextElementEnumerator proses kluster grapheme sesuai dengan versi terbaru Unicode Standard.

Selain itu, Microsoft.VisualBasic.Strings.StrReverse metode , yang membalikkan karakter dalam string di Visual Basic, sekarang juga mengikuti standar Unicode untuk kluster grapheme.

Deskripsi perubahan

Grapheme atau kluster grapheme yang diperluas adalah satu karakter yang dirasakan pengguna yang mungkin terdiri dari beberapa titik kode Unicode. Misalnya, string yang berisi karakter Thailand "kam" (กำ) terdiri dari dua karakter berikut:

  • ก (= '\u0e01') KARAKTER THAILAND KO KAI
  • ำ (= '\u0e33') KARAKTER THAILAND SARA AM

Saat ditampilkan kepada pengguna, sistem operasi menggabungkan dua karakter untuk membentuk karakter tampilan tunggal (atau grapheme) "kam" atau กำ. Emoji juga dapat terdiri dari beberapa karakter yang digabungkan untuk ditampilkan dengan cara yang sama.

Tip

Dokumentasi .NET terkadang menggunakan istilah "elemen teks" saat merujuk ke grapheme.

Kelas StringInfo dan TextElementEnumerator memeriksa string dan mengembalikan informasi tentang graphem yang dikandungnya. Dalam .NET Framework (semua versi) dan .NET Core 3.x dan yang lebih lama, kedua kelas ini menggunakan logika kustom yang menangani beberapa kelas gabungan tetapi tidak sepenuhnya mematuhi Standar Unicode. Misalnya, StringInfo kelas dan TextElementEnumerator salah membagi karakter Tunggal Thailand "kam" kembali ke komponen konstituennya alih-alih menyatukannya. Kelas-kelas ini juga salah membagi karakter emoji " " 🤷🏽 ♀️ menjadi empat kluster (person shrugging, pengubah warna kulit, pengubah gender, dan combiner yang tidak terlihat) alih-alih menjaganya bersama-sama sebagai kluster grapheme tunggal.

Dimulai dengan .NET 5, StringInfo kelas dan TextElementEnumerator menerapkan standar Unicode seperti yang didefinisikan oleh Unicode Standard Annex #29, rev. 35, detik. 3. Secara khusus, mereka sekarang mengembalikan kluster grapheme yang diperluas untuk semua kelas yang menggabungkan.

Pertimbangkan kode C# berikut:

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();
}

Dalam .NET Framework dan .NET Core 3.x dan versi yang lebih lama, graphem dipisahkan, dan output konsol adalah sebagai berikut:

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.)

Di .NET 5 dan versi yang lebih baru, graphem disimpan bersama-sama, dan output konsol adalah sebagai berikut:

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

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

Selain itu, mulai dari .NET 5, Microsoft.VisualBasic.Strings.StrReverse metode , yang membalikkan karakter dalam string di Visual Basic, sekarang juga mengikuti standar Unicode untuk kluster grapheme.

Perubahan ini adalah bagian dari serangkaian peningkatan Unicode dan UTF-8 yang lebih luas di .NET, termasuk API enumerasi kluster grapheme yang diperluas untuk melengkapi API enumerasi nilai skalar Unicode yang diperkenalkan dengan System.Text.Rune jenis di .NET Core 3.0.

Versi yang diperkenalkan

.NET 5.0

Anda tidak perlu melakukan tindakan apa pun. Aplikasi Anda akan secara otomatis berperilaku dengan cara yang lebih sesuai standar dalam berbagai skenario terkait globalisasi.

API yang Terpengaruh