Подтвердить что ты не робот

Специальные символы в .net и IndexOf

Я нашел интересную ошибку, может быть, даже в .net(еще не попробовал это в моно).

IndexOf() метод экземпляра строки возвращает знаковые значения (-1 или ниже) для определенных специальных символов,

например, у меня была строка, содержавшая некоторые специальные символы в Юникоде, а где-то внутри этой строки была двоеточие, которое я искал. Calling IndexOf(" :") для строки, которая, несомненно, содержит " :" возвращаемое значение

Я попытаюсь вставить эту строку здесь, но с учетом специальных символов это может быть сложно:

hitchcock.freenode.net 322 petan #hobbiton 5 :ˁ˚ᴥ˚ˀ > Good luck axa!

Есть ли способ обойти это?

4b9b3361

Ответ 1

Это описано в блоге BCL

IndexOf() делает сравнение инвариантности культуры по умолчанию.

Обратите внимание на это, в частности:

UPDATE для .NET 4 Beta 1 Чтобы поддерживать высокую совместимость между .NET 4 и предыдущими выпусками, мы решили отменить это изменение. Поведение String по умолчанию, частичное совпадение перегрузок и методы String и Char ToUpper и ToLower теперь ведут себя так же, как в .NET 2.0/3.0/3.5. Изменения в исходном поведении присутствуют в .NET 4 Beta 1. Мы приносим свои извинения за любые временные путаницы, которые могут возникнуть. Мы продолжаем рекомендовать явное описание поведения сравнения строк, всегда указывая значение StringComparison для методов String, которые его принимают.

Вы должны использовать метод String.IndexOf(String, Int32, StringComparison):

Например:

IndexOf(":", StringComparison.Ordinal);

Ответ 2

Я вижу, что некоторые люди хотят закрыть этот вопрос по какой-то причине, поэтому я отвечу на него до того, как это произойдет: -)

Благодаря ответам в комментариях @vcsjones, похоже, они связаны с настройками локали и могут быть исправлены путем изменения

text.IndexOf(" :")

к

text.IndexOf(" :", StringComparison.Ordinal)

Это может быть плохой ответ, но лучше, чем ничего...