API Globalisasi menggunakan pustaka ICU di Windows 10
.NET 5 dan versi yang lebih baru menggunakan pustaka Komponen Internasional untuk Unicode (ICU) untuk fungsionalitas globalisasi saat berjalan pada Pembaruan Windows 10 Mei 2019 atau yang lebih baru.
Deskripsi perubahan
Di .NET Core 1.0 - 3.1 dan .NET Framework 4 dan yang lebih baru, pustaka .NET menggunakan API Dukungan Bahasa Nasional (NLS) untuk fungsionalitas globalisasi di Windows. Misalnya, fungsi NLS digunakan untuk membandingkan string, mendapatkan informasi budaya, dan melakukan casing string dalam budaya yang sesuai.
Mulai dari .NET 5, jika aplikasi berjalan di Pembaruan Windows 10 Mei 2019 atau yang lebih baru, pustaka .NET menggunakan API globalisasi ICU, secara default.
Catatan
Pembaruan Windows 10 Mei 2019 dan versi yang lebih baru dikirim dengan pustaka asli ICU. Jika runtime .NET tidak dapat memuat ICU, runtime menggunakan NLS sebagai gantinya.
Perbedaan perilaku
Anda mungkin melihat perubahan di aplikasi meskipun Anda tidak menyadari bahwa Anda menggunakan fasilitas globalisasi. Bagian ini mencantumkan beberapa perubahan perilaku yang mungkin Anda lihat, tetapi ada yang lain juga.
String.IndexOf
Pertimbangkan kode berikut yang memanggil String.IndexOf(String) untuk menemukan indeks karakter baris baru dalam string.
string s = "Hello\r\nworld!";
int idx = s.IndexOf("\n");
Console.WriteLine(idx);
- Di .NET Core 3.1 dan versi yang lebih lama di Windows, cuplikan mencetak
6
. - Di .NET 5 dan pada versi Pembaruan Windows 10 Mei 2019 dan yang lebih baru, cuplikan mencetak
-1
. - Dalam .NET 6 dan versi yang lebih baru, cuplikan mencetak
6
, namun, pustaka ICU masih digunakan.
Untuk memperbaiki kode ini dengan melakukan pencarian ordinal alih-alih pencarian sensitif budaya, panggil IndexOf(String, StringComparison) kelebihan beban dan teruskan StringComparison.Ordinal sebagai argumen.
Anda dapat menjalankan aturan analisis kode CA1307: Tentukan StringComparison untuk kejelasan dan CA1309: Gunakan Perbandingan String ordinal untuk menemukan situs panggilan ini dalam kode Anda.
Untuk informasi selengkapnya, lihat Perubahan perilaku saat membandingkan string pada .NET 5+.
Simbol mata uang
Pertimbangkan kode berikut yang memformat string menggunakan penentu C
format mata uang . Budaya utas saat ini diatur ke budaya yang hanya mencakup bahasa dan bukan negara atau wilayah.
System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("de");
string text = string.Format("{0:C}", 100);
- Di .NET Core 3.1 dan versi yang lebih lama di Windows, nilai teks adalah
"100,00 €"
. - Dalam .NET 5 dan versi yang lebih baru pada Windows 19H1 dan versi yang lebih baru, nilai teks adalah
"100,00 ¤"
, yang menggunakan simbol mata uang internasional alih-alih euro. Dalam ICU, desainnya adalah bahwa mata uang adalah milik negara atau wilayah, bukan bahasa.
Singkatan hari dalam seminggu
Metode ini DateTimeFormatInfo.GetShortestDayName(DayOfWeek) memperoleh nama hari yang disingkat terpendek untuk hari tertentu dalam seminggu.
- Dalam .NET Core 3.1 dan versi yang lebih lama di Windows, singkatan hari dalam seminggu ini terdiri dari dua karakter, misalnya, "Su".
- Dalam .NET 5 dan versi yang lebih baru, singkatan hari dalam seminggu ini hanya terdiri dari satu karakter, misalnya, "S".
Alasan untuk berubah
Perubahan ini diperkenalkan untuk mempersatukan perilaku globalisasi .NET di semua sistem operasi yang didukung. Ini juga menyediakan kemampuan bagi aplikasi untuk membundel pustaka globalisasi mereka sendiri daripada bergantung pada pustaka bawaan sistem operasi.
Versi yang diperkenalkan
.NET 5.0
Tindakan yang direkomendasikan
Tidak ada tindakan yang diperlukan pada bagian pengembang. Namun, jika Anda ingin terus menggunakan API globalisasi NLS, Anda dapat mengatur sakelar run-time untuk kembali ke perilaku tersebut. Untuk informasi selengkapnya tentang sakelar yang tersedia, lihat artikel globalisasi .NET dan ICU .
API yang Terpengaruh
- System.Span<T>
- System.String
- Sebagian besar jenis di System.Globalization namespace
- System.Array.Sort (saat mengurutkan array string)
- System.Collections.Generic.List<T>.Sort() (ketika daftar elemen adalah string)
- System.Collections.Generic.SortedDictionary<TKey,TValue> (saat kunci adalah string)
- System.Collections.Generic.SortedList<TKey,TValue> (saat kunci adalah string)
- System.Collections.Generic.SortedSet<T> (saat himpunan adalah string)