Метод StartsWith C# не возвращает TRUE

Я читаю некоторые значения из базы данных MS SQL, и мне нравится выполнять некоторые операции со строками. Вот код, который я использую, чтобы проверить, начинается ли какая-то строка с другой строки:

String input = "Основното jавно обвинителство денеска поднесе пријава против БМ (59) од Битола заради постоење основи на сомнение дека сторил кривични дела „тешки дела против безбедноста на луѓето и имотот во сообраќајот“ и „неукажување помош на лице повредено во сообраќајна незгода“";
String subString = "Основното јавно обвинителство";
if (input.StartsWith(subString))
{
    Response.Write("OK");
}

Однако input.StartsWith(subString) не возвращает true. Кто-нибудь знает, почему?


person vikifor    schedule 28.12.2013    source источник


Ответы (3)


Отличие в символе j в позиции 10: его код 106 на входе, а в вашей подстроке 1112 (0x458 - см. демонстрацию).

Ваш второй j взят с страницы Unicode 4.

ј   1112    458 0xD1 0x98   CYRILLIC SMALL LETTER JE

Он выглядит так же, но имеет другой код.

Повторный ввод j в substring устраняет эту проблему.

person Sergey Kalinichenko    schedule 28.12.2013

Вторые слова во входных данных и в подстроке не совпадают. Поместите строки в notepad++ и выберите каждое слово за раз. Первое и последнее слово в подстроке совпадают, но не среднее.

Этот пример демонстрирует проблему:

void Main()
{
    var test = "Основното јавно обвинителство";
    var tost = "Основното jавно обвинителство";

    for(var i = 0; i < test.Length; i++){
        Console.WriteLine(string.Format("1: {0}, 2: {1}, Equal: {2}", test[i], tost[i], test[i] == tost[i]));
        if(test[i] != tost[i]){ Console.WriteLine (string.Format("1: {0}, 2: {1}", (int) test[i], (int) tost[i])); }
    }

    Console.WriteLine (test == tost);
}

Соответствующий вывод:

1: ј, 2: j, Equal: False
1: 1112, 2: 106
person Bogdan Balas    schedule 28.12.2013
comment
В частности, во втором слове jавно входная строка имеет j в качестве первого символа, в подстроке первый символ — %d1%98. - person Doug Knudsen; 28.12.2013

Опубликованные вами строки не равны. Сделай это:

string s1 = "Основното јавно обвинителство";
string s2 = "Основното jавно обвинителство";
var bt = Encoding.UTF8.GetBytes(s1);
var bt_1 = Encoding.UTF8.GetBytes(s2);

Вывод будет выглядеть примерно так:

56
55

Фактическая разница заключается в следующем. «J» в первой строке:

[19]    209 byte
[20]    152 byte

тогда как «j» во второй строке:

[19]    106 byte

Первый представляет ј с 0xD1 0x98 шестнадцатеричный код, а второй представляет j с 0x6A шестнадцатеричным кодом.

person Soner Gönül    schedule 28.12.2013