如何比较宽字符“ H2O ??????” 和“?2 ???????”

vag*_*nka 6 c++ string unicode winapi

我正在尝试比较一些相似的字符串,例如:

  1. 字符串的比较"H2O??????""?2???????"应返回true

  2. 字符串的比较"?????????""?2???????"应返回true

我将按TCHAR数组获取这些字符串。有什么方法可以比较这些类型的字符串吗?

我尝试通过逐个字符进行比较,但是它不起作用。

#define MAX_STRING 256
bool IsStringsEqual(TCHAR* str1, TCHAR* str2)
{
    if (_tcscmp(str1, str2) == 0)
        return true;
    else
        return false;   
}

int _tmain(int argc, _TCHAR* argv[])
{
    TCHAR original [MAX_STRING];
    ZeroMemory(original, sizeof(TCHAR) * MAX_STRING);
    _stprintf_s(original, TEXT("%s"), _T("?2????????"));

    TCHAR str1[MAX_STRING];
    ZeroMemory(str1, sizeof(TCHAR) * MAX_STRING);
    _stprintf_s(str1, TEXT("%s"), _T("H2O???????"));
    if (IsStringsEqual(original,str1))
        wcout << endl << " Equal";

    TCHAR str2[MAX_STRING];
    ZeroMemory(str2, sizeof(TCHAR) * MAX_STRING);
    _stprintf_s(str2, TEXT("%s"), _T("?2????????"));
    if (IsStringsEqual(original, str2))
        wcout << endl << " Equal";

    TCHAR str3[MAX_STRING];
    ZeroMemory(str3, sizeof(TCHAR) * MAX_STRING);
    _stprintf_s(str3, TEXT("%s"), _T("??????????"));
    if (IsStringsEqual(original, str3))
        wcout <<endl<< " Equal";

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我希望它在上述所有比较中都能显示Equal。

ybu*_*ill 5

看起来您正在寻找的是Unicode Compatibility normalized forms。您可以通过NormalizeString在比较之前使用来实现它(代码不处理错误和不适合的字符串):

bool IsStringsEqual(wchar_t* str1, wchar_t* str2)
{
    wchar_t buf1[MAX_STRING], buf2[MAX_STRING];
    NormalizeString(NormalizationKD, str1, -1, buf1, MAX_STRING);
    NormalizeString(NormalizationKD, str2, -1, buf2, MAX_STRING);
    return wcscmp(buf1, buf2) == 0;
}
Run Code Online (Sandbox Code Playgroud)