Неожиданное поведение с EndsWith
Может ли кто-нибудь объяснить это поведение?
" ".EndsWith(((char)9917).ToString()) // returns true
StartsWith работает так же.
Ответы
Ответ 1
Как указано в комментариях, метод endswith
использует текущую Культуру, если не указан тип StringComparison.
Вы можете заставить его работать, используя порядковое сравнение:
" ".EndsWith(((char)9917).ToString(), StringComparison.Ordinal); //false
(Ординал в конечном счете сравнит bytes
символов для определения равенства)
Ответ 2
.NET Framework 4 в Windows 7 включает поддержку 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. Levesque в комментариях, в отличие от документации, не был изменен в более поздних версиях.