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.
Zalecana akcja
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.