Condividi tramite


BinaryReader.GetString() restituisce "\uFFFD" in sequenze in formato non valido

È stata introdotta una modifica di rilievo secondaria che influisce solo sui payload codificati in formato non valido.

Prima di .NET 9, una stringa [0x01, 0xC2] codificata in formato non valido analizzata con BinaryReader.ReadString() ha restituito una stringa vuota.

A partire da .NET 9, BinaryReader.ReadString() restituisce "\uFFFD", che viene REPLACEMENT CHARACTER usato per sostituire un carattere sconosciuto, non riconosciuto o non rappresentabile. Questa modifica influisce solo sui payload in formato non valido e corrisponde agli standard Unicode.

Comportamento precedente

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
}

Nuovo comportamento

A partire da .NET 9, lo stesso frammento di codice produce risultati diversi per s == "\uFFFD" e s.Length, come illustrato nei commenti di codice:

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
}

Versione introdotta

.NET 9 Anteprima 7

Tipo di modifica che causa un'interruzione

Questa è una modifica funzionale.

Motivo della modifica

Questa modifica è stata apportata come miglioramento delle prestazioni che influisce su uno scenario raro.

Se si desidera mantenere il comportamento precedente in cui la sequenza di byte incompleta è stata omessa alla fine della stringa, chiamare TrimEnd("\uFFFD") sul risultato.

API interessate