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.
Action recommandée
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.