Dela via


BinaryReader.GetString() returnerar "\uFFFD" på felaktiga sekvenser

En mindre icke-bakåtkompatibel ändring infördes som endast påverkar felaktigt kodade nyttolaster.

Före .NET 9 returnerades en felaktigt kodad sträng [0x01, 0xC2] som parsades med BinaryReader.ReadString() en tom sträng.

Från och med .NET 9 BinaryReader.ReadString() returneras "\uFFFD", som används REPLACEMENT CHARACTER för att ersätta ett okänt, okänt eller icke-representativt tecken. Den här ändringen påverkar endast felaktiga nyttolaster och matchar Unicode-standarder.

Tidigare beteende

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
}

Nytt beteende

Från och med .NET 9 ger samma kodfragment olika resultat för s == "\uFFFD" och s.Length, som visas i kodkommentarerna:

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
}

Version introducerad

Förhandsversion 7 av .NET 9

Typ av icke-bakåtkompatibel ändring

Den här ändringen är en beteendeförändring.

Orsak till ändringen

Den här ändringen gjordes som en prestandaförbättring som påverkar ett sällsynt scenario.

Om du vill behålla det tidigare beteendet där ofullständig bytesekvens utelämnades i slutet av strängen anropar du TrimEnd("\uFFFD") resultatet.

Berörda API:er