BinaryReader.GetString() 在格式错误的序列上返回 "\uFFFD"

引入了一项次要重大更改,仅影响格式错误的编码有效负载。

在 .NET 9 之前,使用 BinaryReader.ReadString() 分析的格式错误的编码字符串 [0x01, 0xC2] 返回了空字符串。

从 .NET 9 开始,BinaryReader.ReadString() 返回 "\uFFFD",这是用于替换未知、无法识别或不可表示的字符的 REPLACEMENT CHARACTER。 此更改仅影响格式错误的有效负载并符合 Unicode 标准。

旧行为

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