2015-10-02 15 views
7

Ich versuche, eine Zeichenfolge mit dem Prime-Symbol darin zu verwenden, aber ich habe einige Probleme mit der String.StartsWith Methode. Warum wirft der folgende Code die Ausnahme?String.StartsWith funktioniert nicht, wenn das nächste Zeichen das Prime-Symbol (char) ist 697

string text_1 = @"123456"; 
string text_2 = @"ʹABCDEF"; 

string fullText = text_1 + text_2; 
if (!fullText.StartsWith(text_1)) 
{ 
    throw new Exception("Unexplained bad error."); 
} 

Ich vermute, dass das Problem ist, weil dieses Prime Symbol (char) 697 als Akzent behandelt wird und so wird den Brief, bevor es zu ändern. (Ich denke nicht, dass es sein sollte - es sollte die the prime symbol sein und sollte daher nicht die numerischen Zahlen davor ändern). Ich weiß nicht genau, wie ich das testen soll. Ich habe versucht, das Verfahren in this answer vorgeschlagen, aber es ergab falsch:

IsLetterWithDiacritics(text_1[5]) // == False 
IsLetterWithDiacritics(fullText[5]) // == False 
IsLetterWithDiacritics(fullText[6]) // == False 

Vielen Dank für jede Hilfe.

+1

Haben Sie versucht, die Überladung zu verwenden, die einen 'StringComparison'-Typ verwendet und ihm gesagt hat, dass er' InvariantCulture' oder 'Ordinal' verwenden soll? –

+1

@BradleyUffner Das wird nicht funktionieren, aber 'fullText.StartsWith (text_1, StringComparison.Ordinal)' funktioniert. – DavidG

Antwort

3

ʹ oder MODIFIER LETTER PRIME ist ein Abstand Modifikator Brief. Es ist kein wahrer Charakter, sondern ein spezielles Gebrauchssymbol, das das vorhergehende Zeichen modifiziert.

From MSDN:

Ein Modifikator Buchstabe sind ein freistehendes Abstands Zeichen, das, wie eine Kombination von Zeichen, Modifikationen eines vorhergehenden Buchstaben gibt.


string.StartsWith ist falsch, weil in Ihrer verketteten Zeichenfolge zurückkehrt, die wird durch das Strichsymbol tatsächlich geändert, dass, nachdem er angehängt wird.

+0

Danke, das habe ich auch gerade am Ende der Wiki-Seite bemerkt, die ich verlinkt habe. Ich erkenne jetzt, dass ich das falsche Prime Symbol verwende - sollte (char) 8242 verwenden, und nicht den Modifikator Buchstabe prime. Danke fürs klarstellen. – Ben

2

Von MSDN:

Wenn Sie einen String-Vergleich-Methode aufrufen, wie String.Compare, String.Equals oder String.IndexOf, sollten Sie immer eine Überlastung aufrufen, die einen Parameter vom Typ StringComparison umfasst, so dass Sie können den Typ des Vergleichs angeben, den die Methode ausführt. Weitere Informationen finden Sie unter Bewährte Methoden für die Verwendung von Zeichenfolgen in .NET Framework.

Sie sollten StringComparison.Ordinal verwenden, wenn Sie einen nicht linguistischen Vergleich durchführen möchten. Der folgende Code wird keine Ausnahme auslösen.

string text_1 = @"123456"; 
string text_2 = @"ʹABCDEF"; 

string fullText = text_1 + text_2; 
if (!fullText.StartsWith(text_1, StringComparison.Ordinal)) 
{ 
    throw new Exception("Unexplained bad error."); 
}