Compartilhar via


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