2015-10-02 33 views
7

Próbuję użyć ciąg z symbolem Prime w nim, ale mam pewne problemy z metodą String.StartsWith. Dlaczego poniższy kod rzuca wyjątek?String.StartsWith nie działa, gdy następny znak jest symbolem podstawowym (char) 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."); 
} 

Podejrzewam, że problem jest z powodu tego Prime symbol (char) 697 jest traktowany jako akcent i tak zmienia nas przed nim. (Nie sądzę, że tak powinno być - powinno być to the prime symbol i dlatego nie powinno się zmieniać numerów liczbowych przed nim). Nie jestem do końca pewien, jak to przetestować. Próbowałem metodę zaproponowaną w this answer ale wrócił fałsz:

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

Dzięki za pomoc.

+1

Czy próbowałeś używać przeciążenia, które pobierają typ "StringComparison" i mówisz mu, aby używał 'InvariantCulture' lub' Ordinal'? –

+1

@BradleyUffner To nie zadziała, ale 'fullText.StartsWith (text_1, StringComparison.Ordinal)' zadziała. – DavidG

Odpowiedz

3

ʹ lub MODIFIER LETTER PRIME jest literą odstęp modyfikatora. To nie jest prawdziwa postać, ale specjalny symbol użycia, który modyfikuje poprzedni znak.

From MSDN:

List modyfikator jest wolnostojący odstępy między znakami, które, podobnie jak łączące znak wskazuje modyfikacje poprzedzającej liście.


string.StartsWith wraca fałszywe, ponieważ w swoim połączonego łańcucha The jest rzeczywiście zmodyfikowana przez głównego symbolu, który jest załączony po nim.

+0

Dzięki, zauważyłem to również na dole strony Wiki, którą połączyłem. Zdaję sobie teraz sprawę, że używam niewłaściwego Symbolu Pierwszego - powinienem używać (char) 8242, a nie prefiksu litery modyfikatora. Dzięki za wytłumaczenie. – Ben

2

Od MSDN:

Kiedy wywołać metodę porównywania ciąg takich jak String.Compare, String.Equals lub String.indexOf, zawsze należy wezwać przeciążenie, który zawiera parametr typu StringComparison tak, że możesz określić typ porównania, który wykonuje metoda. Aby uzyskać więcej informacji, zobacz Sprawdzone metody korzystania z ciągów w systemie .NET Framework.

Powinieneś użyć StringComparison.Ordinal, jeśli chcesz dokonać porównań niejęzykowych. Poniższy kod nie rzuci wyjątku.

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."); 
}