2014-02-09 5 views
14

Может кто-нибудь объяснить это поведение?Неожиданное поведение с EndsWith

" ".EndsWith(((char)9917).ToString()) // returns true 

StartsWith works same.

+1

Для всех, кто интересно: Этот персонаж Сокер-мяч. http://www.fileformat.info/info/unicode/char/26bd/index.htm – usr

+1

Согласно информации о культуре, этот символ эквивалентен пустой строке. 'string.Equals (((char) 9917) .ToString," ", StringComparison.CurrentCulture)' также возвращает 'true'. –

+0

Пожалуйста, проверьте это сообщение http://stackoverflow.com/questions/11467424/somestring-indexofsomestring-returns-1-instead-of-0-under-net-4 также – andrewpey

ответ

2

Как указано в комментариях, метод endswith использует текущую Культуру, если не указан тип StringComparison Type.

Вы можете заставить его работать, с помощью порядкового comparission:

" ".EndsWith(((char)9917).ToString(), StringComparison.Ordinal); //false

(Порядковый, в конечном счете сравнить bytes из символов для определения равенства)

+0

Остерегайтесь того, что сравнение ординалов почти наверняка неверно, если строки не нормализованы, и даже если они нормализованы, сравнение может быть не тем, что предназначено (или, в других случаях, вполне может быть). – hvd

3

.NET Framework 4 on Windows 7 includes support for Unicode 5.1:

Правила сортировки и обсадные культуры чувствительные, используемые в сравнении строк зависит от версии .NET Framework. В .NET Framework 4 информация о сортировке, обсадке, нормализации и Unicode синхронизируется с Windows 7 и соответствует стандарту Unicode 5.1.

Символ, который вы используете, является символом Unicode 5.2, поэтому он может не вести себя корректно в любой функции, отличной от тех, которые сравнивают символы только по числу.

Вы должны увидеть другое поведение (но я не могу проверить его прямо сейчас) в Windows 8 и .NET 4.5: в соответствии с документацией в этом случае поддерживается Unicode 6.0. По словам Томаса Левеска в комментариях, в отличие от документации, это не было изменено в более поздних версиях.

+0

Просто попробовал это в Windows 8.1/.NET 4.5: результат тот же. –

+0

@ThomasLevesque Спасибо, отредактирован. – hvd

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