Warum gibt "\ u1FFF: foo" .StartsWith (":") true zurück?

8

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.

    
Abel 09.11.2017, 19:18
quelle

2 Antworten

9

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 .

    
kvb 09.11.2017, 19:43
quelle
1

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 :

verwenden sollten
  

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 .
  •   
    
Leonid Vasilyev 14.11.2017 10:38
quelle

Tags und Links