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")
。