Bagikan melalui


BinaryReader.ReadString() mengembalikan "\uFFFD" pada urutan cacat

Perubahan kecil yang melanggar diperkenalkan yang hanya memengaruhi payload yang dikodekan salah bentuk.

Sebelum .NET 9, string [0x01, 0xC2] yang dikodekan salah bentuk yang diurai dengan BinaryReader.ReadString() menampilkan string kosong.

Mulai dari .NET 9, BinaryReader.ReadString() mengembalikan "\uFFFD", yang merupakan REPLACEMENT CHARACTER yang digunakan untuk mengganti karakter yang tidak diketahui, tidak dikenal, atau tidak dapat diprediksi. Perubahan ini hanya memengaruhi payload yang salah format dan cocok dengan standar Unicode.

Perilaku sebelumnya

var ms = new MemoryStream(new byte[] { 0x01, 0xC2 });
using (var br = new BinaryReader(ms))
{
    string s = br.ReadString();
    Console.WriteLine(s == "\uFFFD"); // false
    Console.WriteLine(s.Length); // 0
}

Perilaku yang baru

Mulai dari .NET 9, cuplikan kode yang sama menghasilkan hasil yang berbeda untuk s == "\uFFFD" dan s.Length, seperti yang ditunjukkan dalam komentar kode:

var ms = new MemoryStream(new byte[] { 0x01, 0xC2 });
using (var br = new BinaryReader(ms))
{
    string s = br.ReadString();
    Console.WriteLine(s == "\uFFFD"); // true
    Console.WriteLine(s.Length); // 1
}

Versi yang diperkenalkan

Pratinjau .NET 9 7

Jenis perubahan yang melanggar

Perubahan ini adalah perubahan perilaku.

Alasan untuk berubah

Perubahan ini dilakukan sebagai peningkatan performa yang memengaruhi skenario langka.

Jika Anda ingin menyimpan perilaku sebelumnya di mana urutan byte yang tidak lengkap dihilangkan di akhir string, panggil TrimEnd("\uFFFD") hasilnya.

API yang Terpengaruh