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.
Ação recomendada
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.