Partilhar via


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

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

Antes do .NET 9, uma cadeia de caracteres [0x01, 0xC2] codificada malformada que foi analisada com BinaryReader.ReadString() retornou 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. Esta alteração afeta apenas cargas úteis 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 trecho de código produz resultados diferentes para s == "\uFFFD" e s.Length, conforme mostrado nos comentários de 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 Visualização 7

Tipo de mudança de rutura

Esta mudança é uma mudança comportamental.

Razão para a alteração

Essa alteração foi feita como uma melhoria de 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") o resultado.

APIs afetadas