Startet mit Änderung in Windows Server 2012

Bearbeiten: Ich dachte ursprünglich, dass dies mit .NET Framework 4.5 zusammenhängt. Es stellte sich heraus, dass dies auch für .NET Framework 4.0 gilt.

Es gibt eine Änderung in der Behandlung von Zeichenfolgen in Windows Server 2012, die ich besser verstehen möchte. Anscheinend hat sich das Verhalten von StartsWith geändert. Das Problem kann mit .NET Framework 4.0 und 4.5 reproduziert werden.

Mit .NET Framework 4.5 unter Windows 7 gibt das folgende Programm "False, t" aus. Unter Windows 2012 Server wird stattdessen "True, t" gedruckt.

internal class Program
{
   private static void Main(string[] args)
   {
      string byteOrderMark = Encoding.UTF8.GetString(Encoding.UTF8.GetPreamble());
      Console.WriteLine("test".StartsWith(byteOrderMark));
      Console.WriteLine("test"[0]);
   }
}

Mit anderen Worten, StartsWith (ByteOrderMark) gibt unabhängig vom Zeichenfolgeninhalt true zurück. Wenn Sie über einen Code verfügen, der versucht, die Markierung für die Bytereihenfolge mithilfe der folgenden Methode zu entfernen, funktioniert dieser Code unter Windows 7 einwandfrei, gibt unter Windows 2012 jedoch "est" aus.

internal class Program
{
  private static void Main(string[] args)
  {
     string byteOrderMark = Encoding.UTF8.GetString(Encoding.UTF8.GetPreamble());
     string someString = "Test";

     if (someString.StartsWith(byteOrderMark))
        someString = someString.Substring(1);

     Console.WriteLine("{0}", someString);
     Console.ReadKey();

  }

}

Mir ist klar, dass Sie bereits etwas falsch gemacht haben, wenn Sie Byte-Order-Marker in einer Zeichenfolge haben, aber wir integrieren diese in Legacy-Code. Ich weiß, dass ich dieses spezielle Problem lösen kann, indem ich wie folgt vorgehe, aber ich möchte das Problem besser verstehen.

someString = someString.Trim(byteOrderMark[0]);

Hans Passsant schlug vor, den Konstruktor von UTF8Encoding zu verwenden, mit dem ich ihn explizit anweisen kann, einen UTF8-Bezeichner auszugeben. Ich habe es versucht, aber es gibt das gleiche Ergebnis. Der folgende Code unterscheidet sich in der Ausgabe zwischen Windows 7 und Windows Server 2012. Unter Windows 7 wird "Ergebnis: Falsch" ausgegeben. Unter Windows Server 2012 wird "Ergebnis: Wahr" gedruckt.

  private static void Main(string[] args)
  {
     var encoding = new UTF8Encoding(encoderShouldEmitUTF8Identifier: true);
     string byteOrderMark = encoding.GetString(encoding.GetPreamble());
     Console.WriteLine("Result: " + "Hello".StartsWith(byteOrderMark));
     Console.ReadKey();
  }

Ich habe auch die folgende Variante ausprobiert, die unter Windows 7 False, False, False, aber True, True, False unter Windows Server 2012 ausgibt, was bestätigt, dass sie mit der Implementierung von StartsWith unter Windows Server 2012 zusammenhängt.

  private static void Main(string[] args)
  {
     var encoding = new UTF8Encoding(encoderShouldEmitUTF8Identifier: true);
     string byteOrderMark = encoding.GetString(encoding.GetPreamble());
     Console.WriteLine("Hello".StartsWith(byteOrderMark));
     Console.WriteLine("Hello".StartsWith('\ufeff'.ToString()));
     Console.WriteLine("Hello"[0] == '\ufeff');

     Console.ReadKey();
  }

Antworten auf die Frage(1)

Ihre Antwort auf die Frage