Udostępnij za pośrednictwem


Funkcja BinaryReader.GetString() zwraca wartość "\uFFFD" w źle sformułowanych sekwencjach

Wprowadzono niewielką zmianę powodującą niezgodność, która wpływa tylko na nieprawidłowo sformułowane zakodowane ładunki.

Przed platformą .NET 9 źle sformułowany zakodowany ciąg [0x01, 0xC2] , który został przeanalizowany z BinaryReader.ReadString() zwróconym pustym ciągiem.

Począwszy od platformy .NET 9, BinaryReader.ReadString() zwraca wartość "\uFFFD", która jest REPLACEMENT CHARACTER używana do zastępowania nieznanego, nierozpoznanego lub nieokreślonego znaku. Ta zmiana dotyczy tylko nieprawidłowo sformułowanych ładunków i jest zgodna ze standardami Unicode.

Poprzednie zachowanie

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
}

Nowe zachowanie

Począwszy od platformy .NET 9, ten sam fragment kodu generuje różne wyniki dla s == "\uFFFD" elementów i s.Length, jak pokazano w komentarzach kodu:

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
}

Wprowadzona wersja

.NET 9 (wersja zapoznawcza 7)

Typ zmiany powodującej niezgodność

Ta zmiana jest zmianą behawioralną.

Przyczyna wprowadzenia zmiany

Ta zmiana została wprowadzona jako poprawa wydajności, która ma wpływ na rzadki scenariusz.

Jeśli chcesz zachować poprzednie zachowanie, w którym pominięto niekompletną sekwencję bajtów na końcu ciągu, wywołaj TrimEnd("\uFFFD") wynik.

Dotyczy interfejsów API