Geheimnisse der UTF8Encoding-Klasse

Im .NET 1.1 und 2.0 sind folgende Aufrufe der Konstruktoren der Klasse System.Text.UTF8Encoding möglich:

Die Aufrufe

sowie

sind dabei äquivalent, d.h. sie erzeugen funktional identische Instanzen der Klasse.

Die Equals-Methode vergleicht in .NET 1.1 allerdings nur den encoderShouldEmitUTF8Identifier-Parameter von zwei Instanzen. Der Ausdruck utf8falsefalse.Equals(utf8falsetrue) ist also wahr, obwohl sich die Objekte deutlich unterscheiden, was die Behandlung von ungültigen Byte-Sequenzen angeht. In .NET 2.0 arbeitet die Equals-Methode hingegen exakt; beide Parameter müssen übereinstimmen.

Wenn Sie feststellen wollen, ob irgendeine Instanz der UTF8Encoding-Klasse vorliegt, verwenden Sie bspw. If TypeOf utf8 Is System.Text.UTF8Encoding Then und nicht die Equals-Methode.

Die Encoding-Eigenschaft der XmlTextReader-Klasse liefert stets ein Encoding-Objekt, das mit UTF8Encoding(encoderShouldEmitUTF8Identifier:=True, throwOnInvalidBytes:=True) instantiiert wurde, sofern dieses Encoding-Objekt eine Instanz der UTF8Encoding-Klasse ist. Dies ist unabhängig davon, ob der Stream mit einem BOM beginnt!

Encoding.GetEncoding("utf-8") liefert hingegen ein Encoding-Objekt, das mit UTF8Encoding(encoderShouldEmitUTF8Identifier:=True, throwOnInvalidBytes:=False) instantiiert wurde.