Compartir a través de


BinaryReader.GetString() devuelve "\uFFFD" en secuencias con formato incorrecto

Se introdujo un cambio importante menor que solo afecta a las cargas codificadas con formato incorrecto.

Antes de .NET 9, una cadena codificada con formato incorrecto [0x01, 0xC2] que se analizaba con BinaryReader.ReadString() devolvía una cadena vacía.

A partir de .NET 9, BinaryReader.ReadString() devuelve "\uFFFD", que es el REPLACEMENT CHARACTER que se usa para reemplazar un carácter desconocido, no reconocido o no representativo. Este cambio solo afecta a las cargas con formato incorrecto y coincide con los estándares Unicode.

Comportamiento 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
}

Comportamiento nuevo

A partir de .NET 9, el mismo fragmento de código genera resultados diferentes para s == "\uFFFD" y s.Length, como se muestra en los comentarios 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
}

Versión introducida

.NET 9 (versión preliminar 7)

Tipo de cambio importante

Este es un cambio de funcionamiento.

Motivo del cambio

Este cambio se realizó como una mejora del rendimiento que afecta a un escenario poco frecuente.

Si desea mantener el comportamiento anterior en el que se omitió la secuencia de bytes incompleta al final de la cadena, llame a TrimEnd("\uFFFD") en el resultado.

API afectadas