2013-03-23 13 views
10

Ho pensato che StringComparison.OrdinalIgnoreCase e StringComparison.InvariantCultureIgnoreCase fanno lo stesso lavoro quando si tratta di stringhe solo in inglese. Tuttavia non è il caso nel seguente codice a cui sto lavorando:Perché OrdinalIgnoreCase e InvariantCultureIgnoreCase restituiscono risultati diversi?

// Returns 0 
string.Compare("877495169FA05B9D8639A0EBC42022338F7D2324","‎877495169fa05b9d8639a0ebc42022338f7d2324", StringComparison.InvariantCultureIgnoreCase) 

// Returns -1 
string.Compare("877495169FA05B9D8639A0EBC42022338F7D2324","‎877495169fa05b9d8639a0ebc42022338f7d2324", StringComparison.OrdinalIgnoreCase) 

C'è un motivo particolare per cui?

+2

possibile duplicato di [Differenza tra InvariantCulture e Confronto stringa ordinale] (http://stackoverflow.com/questions/492799/difference-between-invariantculture-and-ordinal-string-comparision) –

+3

@ DanielA.White Questa domanda è sicuramente non _non_ un duplicato di quella domanda. Penso che tu non abbia letto questo. – Virtlink

risposta

23
"‎877495169fa05b9d8639a0ebc42022338f7d2324" 

Suona come una domanda trabocchetto. C'è un carattere in più all'inizio di questa stringa, prima della prima cifra 8. Non è visibile nel browser. È U + 200E, "Segno da sinistra a destra". Il confronto ordinale vede quel carattere, il confronto invariante lo ignora. Puoi vederlo da solo usando ToCharArray() sulla stringa.

Eliminare quella stringa e incolla questo uno invece, ho rimosso U + 200E da esso:

"877495169fa05b9d8639a0ebc42022338f7d2324" 

E il metodo Compare() ora restituisce 0 come dovrebbe. Fai attenzione a quell'editor di testo o IME che stai usando in questo momento. Non è divertente Unicode?

+0

Ben avvistato. Nel mio Notepad ++ si presenta come un punto interrogativo: ""? 877495169fa05b9d8639a0ebc42022338f7d2324 "'. – Virtlink

+3

Grazie! Non è una domanda trabocchetto, in realtà ho copiato questa stringa come identificazione personale di un certificato da certmgr.msc al mio programma, e non ho superato il confronto. Non avevo idea che potesse contenere personaggi invisibili. È venuto fuori che Visual Studio non mostra anche quei personaggi. È divertente! –

+1

Ok, questo ha più senso. Per la cronaca: quale versione linguistica di Windows ha prodotto questo? –

Problemi correlati