是否存在函数/ WinAPI来区分一个字符串是否以不区分大小写的语言方式以另一字符串开头?

时间:2018-12-21 08:28:08

标签: c++ winapi c-strings crt linguistics

说明我的问题的最好方法是使用此示例(如果使用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

到目前为止,与LINGUISTIC_IGNORECASE标志一起使用时,似乎唯一能够识别语言字符串等效性的WinAPI是CompareStringEx,但用于此目的有些棘手且效率低下,因为我必须调用反复在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 :(得分:1)

您可以使用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 :(得分:0)

我还没有尝试过,但是我认为您可能可以使用LCMapStringEx将所有字​​符串转换为适合区域设置的小写字母,然后与wcsncmp进行正常的字符串前缀匹配。

(如注释中所述,在示例中使用wcsstr是没有意义的,因为wcsstr确定一个字符串是否包含另一个字符串。要确定一个字符串是否以另一个字符串开头,则更重要。可以使用wcsncmp和前缀字符串的长度。)