Die Zeichenfolge "\u1FFF:foo"
beginnt mit \u1FFF
(oder ""), oder?
Also, wie können diese beiden wahr sein?
%Vor%Fordert .NET, dass diese Zeichenfolge mit zwei verschiedenen Zeichen beginnt?
Und während ich das sehr überraschend finde und das "warum" verstehen möchte, interessiert mich auch, wie ich .NET zwingen kann, ausschließlich nach Codepunkten zu suchen (mit InvariantCulture
). scheint nichts zu tun)?
Und zum Vergleich, ein Zeichen darunter, gibt "\u1FFE:foo".StartsWith(":")
false zurück.
Dass ein String im Allgemeinen so betrachtet werden kann, dass er mit zwei verschiedenen Strings beginnt, die nicht Byte für Byte identisch sind, ist nicht überraschend (weil Unicode kompliziert ist). Zum Beispiel werden diese Ergebnisse fast immer widerspiegeln, was ein Benutzer möchte:
%Vor% Mit System.Globalization.CharUnicodeInfo.GetUnicodeCategory
können Sie sehen, dass '\u1fff'
in der Kategorie "OtherNotAssigned" ist; Es ist mir unklar, ob das Auswirkungen auf die Suche / Sortierung / Vergleich von Zeichenfolgen haben sollte (es scheint sich nicht auf die Normalisierung auszuwirken, das heißt, die Zeichen bleiben nach der Normalisierung erhalten).
Wenn Sie einen Byte-für-Byte-Vergleich wünschen, verwenden Sie StringComparison.Ordinal
.
Weil Sie String.StartsWith()
falsch verwenden. Sie sollten String.StartsWith (String, StringComparison)
overload und StringComparison.Ordinal
verwenden.
Dem \u1FFF
ist kein Zeichen zugewiesen. I.e. Dieser Code hat keine linguistische Bedeutung. Siehe Griechisch Erweitert, Bereich: 1F00-1FFF Auszug aus Zeichencodetabellen für den Unicode-Standard. Best Practices für die Verwendung von Strings in .NET Dokument von MSDN explizit besagt, dass wenn Sie Strings so vergleichen müssen, dass Features von natürlichen Sprachen ignoriert werden, Sie StringComparison.Ordinal
:
Angabe des StringComparison.Ordinal oder StringComparison.OrdinalIgnoreCase Wert in einem Methodenaufruf bedeutet einen nicht linguistischen Vergleich, bei dem die Eigenschaften natürlicher Sprachen ignoriert werden . Methoden, die mit diesen StringComparison -Werten aufgerufen werden, basieren auf Zeichenfolgenoperationsentscheidungen für einfache Bytevergleiche anstelle von Hüllen- oder Äquivalenztabellen, die durch Kultur parametrisiert werden. In den meisten Fällen passt dieser Ansatz am besten zur beabsichtigten Interpretation von Strings, während der Code schneller und zuverlässiger wird.
Außerdem empfiehlt es, in solchen Methodenaufrufen immer StringComparison
explizit anzugeben:
Wenn Sie mit .NET arbeiten, befolgen Sie diese einfachen Empfehlungen, wenn Sie Zeichenfolgen verwenden:
- Verwenden Sie Überladungen, die die Zeichenfolgenvergleichsregeln für Zeichenfolgenoperationen explizit angeben. In der Regel wird dabei eine Methodenüberladung aufgerufen, die einen Parameter vom Typ aufweist StringComparison .