BinaryReader.ReadString() retorna "\uFFFD" em sequências malformadas

Foi introduzida uma pequena alteração que afeta apenas as cargas úteis codificadas malformadas.

Antes do .NET 9, uma cadeia de caracteres codificada malformada [0x01, 0xC2] analisada com BinaryReader.ReadString() retornava uma cadeia de caracteres vazia.

A partir do .NET 9, BinaryReader.ReadString() retorna "\uFFFD", que é usado REPLACEMENT CHARACTER para substituir um caractere desconhecido, não reconhecido ou não representável. Essa alteração afeta apenas as cargas malformadas e corresponde aos padrões Unicode.

Comportamento anterior

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
}

Novo comportamento

A partir do .NET 9, o mesmo snippet de código produz resultados diferentes para s == "\uFFFD" e s.Length, conforme mostrado nos comentários do código:

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
}

Versão introduzida

.NET 9 versão prévia 7

Tipo de alteração interruptiva

Esta é uma alteração comportamental.

Motivo da alteração

Essa alteração foi feita como uma melhoria no desempenho que afeta um cenário raro.

Se você quiser manter o comportamento anterior em que a sequência de bytes incompleta foi omitida no final da cadeia de caracteres, chame TrimEnd("\uFFFD") no resultado.

APIs afetadas