Проблема сравнения французского символа Î - PullRequest
8 голосов
/ 20 мая 2010

При сравнении "Île" и "Ile" C # не считает, что они одинаковы.

    string.Equals("Île", "Ile", StringComparison.InvariantCultureIgnoreCase)

Для всех других акцентированных символов, с которыми я сталкивался, сравнение отлично работает.

Есть ли другая функция сравнения, которую я должен использовать?

1 Ответ

6 голосов
/ 20 мая 2010

Вы указываете для сравнения строк, используя правила сравнения инвариантной культуры. Очевидно, что в инвариантной культуре две строки не считаются равными.

Вы можете сравнить их в зависимости от культуры, используя String.Compare и предоставив ту культуру, для которой вы хотите сравнить строки:

if(String.Compare("Île", "Ile", new CultureInfo("fr-FR"), CompareOptions.None)==0)

Обратите внимание, что во французской культуре эти строки также считаются разными. Я включил пример, чтобы показать, что именно культура определяет правила сортировки. Возможно, вам удастся найти культуру, которая соответствует вашим требованиям, или создать собственную с необходимыми правилами сравнения, но, вероятно, это не то, что вам нужно.

Для хорошего примера нормализации строки без акцентов взгляните на этот вопрос . После нормализации строки вы сможете сравнить их и считать их равными. Вероятно, это будет самый простой способ выполнить ваше требование.

Редактировать

В InvariantCulture такое поведение характерно не только для символа I, но и для этого оператора возвращается false:

String.Equals("Ilê", "Ile", StringComparison.InvariantCultureIgnoreCase)

Фреймворк делает правильные вещи - эти символы на самом деле разные (имеют разное значение) в большинстве культур, и поэтому их не следует считать одинаковыми.

...