Бөлісу құралы:


BinaryReader.ReadString() возвращает значение "\uFFFD" в неправильно сформированных последовательностях

Было введено незначительное критическое изменение, которое влияет только на неправильно сформированные полезные данные в кодировке.

До .NET 9 кодированная строка [0x01, 0xC2] , которая была проанализирована с BinaryReader.ReadString() возвращаемой пустой строкой.

Начиная с .NET 9, BinaryReader.ReadString() возвращает значение \uFFFD, которое REPLACEMENT CHARACTER используется для замены неизвестного, неузнаваемого или непреднаставимого символа. Это изменение влияет только на неправильные полезные данные и соответствует стандартам Юникода.

Прежнее поведение

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
}

Новое поведение

Начиная с .NET 9, один и тот же фрагмент кода создает различные результаты для s == "\uFFFD" и s.Length, как показано в комментариях кода:

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
}

Представленные версии

.NET 9( предварительная версия 7)

Тип критического изменения

Это изменение поведения.

Причина изменения

Это изменение было сделано в качестве улучшения производительности, которое влияет на редкий сценарий.

Если вы хотите сохранить предыдущее поведение, в котором неполная последовательность байтов была опущена в конце строки, вызовите TrimEnd("\uFFFD") результат.

Затронутые API