как сравнить широкие символы "H2O リ テ イ リ ン グ" и "H2O リ テ イ リ ン グ" - PullRequest
6 голосов
/ 10 мая 2019

Я пытаюсь сравнить некоторые строки, которые похожи, например:

  1. Сравнение строк "H2Oリテイリング" и "H2Oリテイリング" должно вернуть true

  2. Сравнение строк "H2Oリテイリング" и "H2Oリテイリング" должно вернуть 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("H2Oリテイリング㈱"));

    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("H2Oリテイリング㈱"));
    if (IsStringsEqual(original, str2))
        wcout << endl << " Equal";

    TCHAR str3[MAX_STRING];
    ZeroMemory(str3, sizeof(TCHAR) * MAX_STRING);
    _stprintf_s(str3, TEXT("%s"), _T("H2Oリテイリング㈱"));
    if (IsStringsEqual(original, str3))
        wcout <<endl<< " Equal";

    return 0;
}

Я ожидаю, что он напечатает Equalдля всех вышеперечисленных сравнений.

1 Ответ

4 голосов
/ 10 мая 2019

Похоже, что вы ищете Нормализованные формы Unicode . Вы можете достичь этого, используя 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...