2012-02-13 1 views
9

У меня есть строка «Ärger, -Ökonom-i-Übermut-ẞ-ß», и когда я запускаю IndexOf («-»), я получаю результат 23. Если я использую Replace на одна и та же строка ничего не заменяет.Странные результаты IndexOf на немецкой строке

Я не понимаю, что происходит, так кто-то может пролить свет на эту проблему? Культура приложения установлена ​​на хорватском языке, это не немецкий язык, а каркасная версия - 3.5.

Изменение культуры на немецкий (de-DE) не изменяет этого странного поведения.

Вот скриншот из отладчика:

enter image description here

+2

Правильно ли, что в строке нет «-»? –

+0

Я бы так сказал, так или иначе IndexOf обрабатывает ẞ как a -, именно это проблема –

+2

Звучит как ошибка для меня. Я могу воспроизвести проблему с .Net 3.5, но она возвращает -1, как ожидалось, с .Net 4.0. – ken2k

ответ

3

Поскольку господин Листер не хочет его заслуженных фаворитов, я вставлю здесь свой комментарий и приму ответ.

Боюсь, что U + 1E9E не определено в соответствии с .NET 3.5, так как этот символ не существует в Unicode 4.0 (или любой другой версии Unicode .NET 3.5 использований). Это довольно новое дополнение (в верхнем регистре немецкого ß). Поэтому функция IndexOf игнорирует ее. Если у вас есть контроль над текстом , вы можете изменить символ на ß или SS, , что более подходит. Конечно, лучшим решением является обновление .NET до версии 4.0!

1

IndexOf использует текущую культуру, если не сказать иначе:

Этот метод выполняет слово (чувствителен к регистру и чувствительный к культуре) поиск с использованием текущей культуры.

Replace использует порядковое сравнение:

Этот метод выполняет порядковое (чувствительная к регистру, и культура нечувствительные) поиска, чтобы найти oldValue.

+2

Есть ли что-то, что изменилось в этом аспекте между .NET 3.5 и .NET 4.0? Потому что код работает так, как ожидалось, в .NET 4.0. –

+0

@ Darin: Не уверен - это поведение было задокументировано столько, сколько я помню. Сейчас я делаю несколько тестов, но я не могу реплицировать результаты OP в .NET4. – LukeH

+0

Да, но в .NET 3.5 поведение может быть воспроизведено. –