IndexOf () против Replace () и не присоединяемый к нулевой ширине - PullRequest
2 голосов
/ 14 октября 2019

Почему IndexOf() игнорирует несоединителя нулевой ширины char, а Replace() не:

class Program
{
    static void Main(string[] args)
    {
        const string zeroWidthNonJoiner = "\u200C";

        string str = $"ab{zeroWidthNonJoiner}cd";

        int index = str.IndexOf("bc"); //index = 1 (does ignore the zeroWidthNonJoiner)

        string replaced = str.Replace("bc", "BC"); //replaced = "abcd" (does NOT ignore the zeroWidthNonJoiner)

    }
}

1 Ответ

0 голосов
/ 14 октября 2019

Объяснение

String.Replace(String,string) s doco doco состояния:

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

String.IndexOf * Исходный код показывает, что он использует StringComparison.CurrentCulture

public int IndexOf(String value) {
            return IndexOf(value, StringComparison.CurrentCulture);
        }

Что делать

В ядре .NET вы можете сделать это с InvariantCulture

string replaced = str.Replace("bc", "BC", StringComparison.InvariantCulture); 
...