次の方法で共有


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 Preview 7

破壊的変更の種類

この変更は、動作変更です。

変更理由

この変更は、まれなシナリオに影響するパフォーマンスの改善として行われました。

以前の動作 (文字列の末尾で不完全なバイト シーケンスが省略されるという動作) を維持したい場合は、結果に対して TrimEnd("\uFFFD") を呼び出します。

影響を受ける API