Есть ли функция / WinAPI, чтобы сказать, начинается ли одна строка с другой строки без учета регистра лингвистическим способом? - PullRequest
0 голосов
/ 21 декабря 2018

Лучший способ проиллюстрировать мой вопрос с помощью этого примера (который не работает, если я использую strstr CRT-функцию):

const wchar_t* s1 = L"Hauptstraße ist die längste";
const wchar_t* s2 = L"Hauptstrasse";

bool b_s1_starts_with_s2 = !!wcsstr(s1, s2);
_ASSERT(b_s1_starts_with_s2);   //Should be true

Пока что единственныйWinAPI, который, по-видимому, распознает лингвистическую эквивалентность строк, равен CompareStringEx при использовании с флагом LINGUISTIC_IGNORECASE, но его несколько сложно и неэффективно использовать для этой цели, поскольку мне придется вызывать его на s2до тех пор, пока я не достигну его конца.

Так что мне было интересно, есть ли лучший способ сделать это (под Windows)?

РЕДАКТИРОВАТЬ: Вот что я имею в виду:

bool b_s1_starts_with_s2 = false;

int ln1 = (int)wcslen(s1);
int ln2 = (int)wcslen(s2);

for(int p = 1; p <= ln1; p++)
{
    if(::CompareString(LOCALE_USER_DEFAULT, LINGUISTIC_IGNORECASE,
        s1, p,
        s2, ln2) == CSTR_EQUAL)
    {
        //Match
        b_s1_starts_with_s2 = true;
        break;
    }
}

Ответы [ 2 ]

0 голосов
/ 22 декабря 2018

Вы можете использовать FindNLSString, проверьте, равно ли возвращаемое значение нулю.

Очевидно, это соответствует ß с ss

const wchar_t *s1 = L"Hauptstraße ist die längste";
const wchar_t *s2 = L"Hauptstrasse";

INT found = 0;
int start = FindNLSString(0, LINGUISTIC_IGNORECASE, s1, -1, s2, -1, &found);
wprintf(L"start = %d\n", start);

s1 = L"δεθ Testing Greek";
s2 = L"ΔΕΘ";
start = FindNLSString(0, LINGUISTIC_IGNORECASE, s1, -1, s2, -1, &found);
wprintf(L"start = %d\n", start);
0 голосов
/ 21 декабря 2018

Я не пробовал, но я думаю, что вы, вероятно, могли бы использовать LCMapStringEx, чтобы преобразовать все строки в нижний регистр соответственно для локали, а затем сделать нормальное совпадение префикса строки с wcsncmp.

(Как отмечено в комментариях, нет смысла использовать wcsstr в вашем примере, поскольку wcsstr определяет, содержит ли одна строка другую строку. Чтобы определить, начинается ли одна строка с другой строки, более эффективноиспользуйте wcsncmp с длиной строки префикса.)

...