Partager via


BinaryReader.GetString() retourne « /uFFFD » sur des séquences mal formées

Un changement radical mineur a été introduit qui affecte uniquement les charges utiles encodées mal formées.

Avant .NET 9, une chaîne encodéé mal formée [0x01, 0xC2] qui était analysée avec BinaryReader.ReadString() retournait une chaîne vide.

À compter de .NET 9, BinaryReader.ReadString() retourne « \uFFFD », qui est le REPLACEMENT CHARACTER utilisé pour remplacer un caractère inconnu, non reconnu ou non représentable. Cette modification affecte uniquement les charges utiles mal formées et correspond aux normes Unicode.

Comportement précédent

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
}

Nouveau comportement

À compter de .NET 9, le même extrait de code génère des résultats différents pour s == "\uFFFD" et s.Length, comme indiqué dans les commentaires de code :

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
}

Version introduite

.NET 9 Préversion 7

Type de changement cassant

Ce changement est un changement de comportement.

Raison du changement

Cette modification a été apportée en tant qu’amélioration des performances qui affecte un scénario rare.

Si vous souhaitez conserver le comportement précédent où la séquence d’octets incomplète a été omise à la fin de la chaîne, appelez TrimEnd("\uFFFD") au niveau du résultat.

API affectées