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

Почему string.StartsWith( "\ u2D2D" ) всегда возвращает true?

Я занимался синтаксическим анализом на С# и обнаружил, что для каждой строки, которую я пробовал, string.StartsWith("\u2D2D") вернет true. Почему это?

Кажется, он работает с каждым char. Пробовал этот код с .Net 4.5, отладчик не сломался.

for (char i = char.MinValue; i < char.MaxValue; i++)
{
    if(!i.ToString().StartsWith("\u2d2d"))
    {
        Debugger.Break();
    }
}
4b9b3361

Ответ 1

Я думаю, что попробую.

Из того, что я получаю, является то, что U + 2D2D был добавлен в Unicode v6.1 (source/источник).

.NET framework или собственные вызовы поддерживают более низкую версию:

Правила сортировки и обсадки, чувствительные к культуре, используемые в строках сравнение зависит от версии .NET Framework. В .NET. Framework 4.5, работающий в операционной системе Windows 8, сортировка, обтекания, нормализации и символьной информации Юникода соответствует стандарт Unicode 6.0. В других операционных системах он соответствует стандарт Unicode 5.0. (источник)

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

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

Пример:

var culture = new CultureInfo("en-US");
int result = culture.CompareInfo.Compare("", "\u2D2D", CompareOptions.None);
Assert.AreEqual(0, result);

string.StartsWith использует аналогичную реализацию, но вместо этого использует CompareInfo.IsPrefix(string, string, CompareOptions).