2009-12-12 17 views
6

ich folgende Zeichen zu behandeln versuchen: ⨝ (http://www.fileformat.info/info/unicode/char/2a1d/index.htm)string.Empty.StartsWith (((char) 10781) .ToString()) gibt immer wahr zurück?

Wenn Sie, ob eine leere Zeichenfolge mit diesem Zeichen beginnt die Überprüfung, es immer true zurück, das macht keinen Sinn! Warum das?

// visual studio 2008 hides lines that have this char literally (bug in visual studio?!?) so i wrote it's unicode instead. 
char specialChar = (char)10781; 
string specialString = specialChar.ToString(); 

// prints 1 
Console.WriteLine(specialString.Length); 

// prints 10781 
Console.WriteLine((int)specialChar); 

// prints false 
Console.WriteLine(string.Empty.StartsWith("A")); 

// both prints true WTF?!? 
Console.WriteLine(string.Empty.StartsWith(specialString)); 
Console.WriteLine(string.Empty.StartsWith(((char)10781).ToString())); 

Antwort

11

Sie können diesen Fehler beheben, indem ordinal StringComparison mit:

Aus der MSDN-Dokumentation:

Wenn Sie angeben, entweder StringComparison.Ordinal oder StringComparison.OrdinalIgnoreCase, der String-Vergleich wird nicht -linguistisch. Das heißt, die Funktionen , die für die natürliche Sprache spezifisch sind, werden ignoriert, wenn Vergleichsentscheidungen getroffen werden. Das bedeutet, dass die Entscheidungen auf einfachen Byte Vergleichen beruhen und Gehäuse oder Äquivalenztabellen ignorieren, die per Kultur parametrisiert sind. Als Ergebnis durch den Parameter explizit zu Einstellung entweder der StringComparison.Ordinal oder StringComparison.OrdinalIgnoreCase, Code gewinnt oft Geschwindigkeit erhöht Korrektheit, und wird mehr zuverlässig.

char specialChar = (char)10781; 


    string specialString = Convert.ToString(specialChar); 

    // prints 1 
    Console.WriteLine(specialString.Length); 

    // prints 10781 
    Console.WriteLine((int)specialChar); 

    // prints false 
    Console.WriteLine(string.Empty.StartsWith("A")); 

    // prints false 
    Console.WriteLine(string.Empty.StartsWith(specialString, StringComparison.Ordinal)); 
+0

Kultur-sensitive-Vergleich-standardmäßig scheint eine große katastrophale Verletzung des Prinzips der geringsten Überraschung. Gibt es eine Faustregel, um zu bestimmen, welche Methoden einen StringComparison benötigen, um "normales" Ordnungsverhalten zu erhalten und welche nicht? – bobince

+0

@ bobince- haben Sie diese Frage http: // stackoverflow gesehen.com/questions/72696/which-is-im Allgemeinen-best-to-use-stringcomparison-ordinalignorecore-or-stringcom – RichardOD

4

Nizza Unicode-Glitch ;-P

Ich bin nicht sicher, warum es dies tut, aber unterhaltend:

Console.WriteLine(string.Empty.StartsWith(specialString)); // true 
Console.WriteLine(string.Empty.Contains(specialString)); // false 
Console.WriteLine("abc".StartsWith(specialString)); // true 
Console.WriteLine("abc".Contains(specialString)); // false 

Ich vermute, das ein bisschen wie der nicht behandelt wird verbindendes Zeichen, das Jon mentioned at devdays; einige String-Funktionen sehen es, andere nicht. Und wenn es es nicht sieht, wird dies "do (einige Zeichenfolge) beginnt mit einer leeren Zeichenfolge", die ist immer wahr.

+0

+1 von mir. Ich hatte Jons Gespräch nicht gesehen. – RichardOD

4

Der eigentliche Grund dafür ist der Standard-String Vergleich locale bewusst ist. Dies bedeutet, dass Tabellen von Gebietsschema-Daten für Vergleiche (einschließlich Gleichheit) verwendet werden.

Viele (wenn nicht die meisten) Unicode-Zeichen haben keinen Wert für viele Gebietsschemata und existieren daher nicht (oder tun es, aber stimmen mit irgendetwas oder gar nichts überein).

Siehe Einträge zu Zeichengewichten auf Michael Kaplans Blog "Sorting It All Out". This series von Blogs enthält eine Menge Hintergrundinformationen (die APIs sind nativ, aber —, wie ich — die Mechanismen in .NET verstehen, sind die gleichen).

Schnelle Version: Dies ist ein komplexer Bereich zu erwarten (in der Regel Sprache) Vergleiche richtig ist schwer, dies führt zu seltsamen Dingen mit Codepunkten für Glyphen außerhalb Ihrer Sprache.

Verwandte Themen