2013-03-23 3 views
10

Я думал, что StringComparison.OrdinalIgnoreCase и StringComparison.InvariantCultureIgnoreCase выполняют ту же работу, когда речь идет о струнах только для английского. Однако это не так в следующем коде, над которым я работаю:Почему OrdinalIgnoreCase и InvariantCultureIgnoreCase возвращают разные результаты?

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

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

Есть ли особая причина, почему?

+2

Возможный дубликат [Разница между инвариантной культурой и сравнением исходных строк] (http://stackoverflow.com/questions/492799/difference-between-invariantculture-and-ordinal-string-comparision) –

+3

@ DanielA.White Этот вопрос есть скорее всего, это не дубликат этого вопроса. Думаю, вы этого не читали. – Virtlink

ответ

23
"‎877495169fa05b9d8639a0ebc42022338f7d2324" 

Звучит как трюк. В начале этой строки есть дополнительный символ, перед первой цифрой 8. Он не отображается в браузере. Это U + 200E, «Слева от правого знака». По порядковому сравнению этот символ, инвариантное сравнение игнорирует его. Вы можете увидеть это сами, используя ToCharArray() в строке.

Удалить эту строку и вставьте этот вместо этого, я удалил U + 200E от него:

"877495169fa05b9d8639a0ebc42022338f7d2324" 

и метод сравнения() теперь возвращает 0, как это должно быть. Следите за тем текстовым редактором или IME, которые вы используете прямо сейчас. Разве Unicode не весело?

+0

Красивые пятна. В моем Notepad ++ он отображается как вопросительный знак: '"? 877495169fa05b9d8639a0ebc42022338f7d2324 ". – Virtlink

+3

Спасибо! Это не трюк, я действительно скопировал эту строку как отпечаток сертификата certmgr.msc в мою программу и не смог выполнить сравнение. Я понятия не имел, что может содержать невидимые персонажи. Оказывается, Visual Studio не отображает эти символы. Это весело! –

+1

Хорошо, это имеет смысл. Для записи: какая языковая версия Windows создала это? –

Смежные вопросы