2015-10-02 17 views
7

Sto tentando di utilizzare una stringa con il simbolo Prime, ma sto riscontrando alcuni problemi con il metodo String.StartsWith. Perché il seguente codice lancia l'eccezione?String.StartsWith not Working quando il carattere successivo è il simbolo Prime (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."); 
} 

ho il sospetto che il problema è dovuto al fatto questo simbolo Prime (char) 697 viene trattato come un accento, e così sta cambiando la lettera prima di esso. (Non penso che dovrebbe essere - dovrebbe essere il the prime symbol e quindi non dovrebbe essere cambiare i numeri numerici di fronte ad esso). Non sono esattamente sicuro di come testarlo. Ho provato il metodo proposto in this answer ma tornato falsa:

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

Grazie per qualsiasi aiuto.

+1

Hai provato a utilizzare il sovraccarico che accetta un tipo 'StringComparison' e dice di utilizzare' InvariantCulture' o 'Ordinal'? –

+1

@BradleyUffner Questo non funzionerà, ma 'fullText.StartsWith (text_1, StringComparison.Ordinal)' funzionerà. – DavidG

risposta

3

ʹ o MODIFIER LETTER PRIME è una lettera spaziatura modificatore. Non è un vero personaggio ma un simbolo di uso speciale che modifica il carattere precedente.

From MSDN:

Una lettera modificatore è un carattere autoportante spaziatura che, come un carattere di combinazione, indica modifiche di una lettera precedente.


string.StartsWith sta tornando falso perché nella stringa concatenati, il è effettivamente modificato dal simbolo primo che viene aggiunto dopo.

+0

Grazie, l'ho notato anche nella parte inferiore della pagina Wiki che ho collegato. Mi rendo conto ora che sto usando il Simbolo Prime sbagliato - dovrei usare (char) 8242, e non la lettera di modifica primo. Grazie per il chiarimento. – Ben

2

Da MSDN:

Quando si chiama un metodo di confronto stringa come String.Compare, String.Equals o String.IndexOf, si dovrebbe sempre chiamare un sovraccarico che include un parametro di tipo StringComparison in modo che è possibile specificare il tipo di confronto eseguito dal metodo. Per ulteriori informazioni, vedere Procedure ottimali per l'utilizzo di stringhe in .NET Framework.

È necessario utilizzare StringComparison.Ordinal se si desidera effettuare un confronto non linguistico. Il seguente codice non genererà un'eccezione.

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