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

Лучший способ проиллюстрировать мой вопрос с помощью этого примера (это не работает, если я использую 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;
}
}

0

Решение

Ты можешь использовать 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);
1

Другие решения

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

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

0

По вопросам рекламы [email protected]