Как сравнить std :: wstring & char *? - PullRequest
       14

Как сравнить std :: wstring & char *?

0 голосов
/ 21 февраля 2011

Что у меня есть:

  • [wstr1] 1 std :: wstring значение (например, "(GMT + 04: 30) Кабул")
  • [str2] 1 char * заполнен теми же данными, что и std :: wstring (с тем же текстом)

Я просто пытаюсь сравнить эти два значения - носледующий код не работаетKMP.

Вот конвертер из char * в std :: wstring,

std::wstring TimeZone::TimeZone::char2ws(const char* src)
{
    /* Convert to a wchar_t*
     * http://msdn.microsoft.com/en-us/library/ms235631(v=vs.80).aspx
     */

    // Convert to a wchar_t*
    size_t origsize = strlen(src) + 1;
    const size_t newsize = 512;
    size_t convertedChars = 0;
    wchar_t wcstring[newsize];
    mbstowcs_s(&convertedChars, wcstring, origsize, src, _TRUNCATE);

    return wcstring;
}

, после чего я сделал простое сравнение с

// wstr1 is std::wstring, with "(GMT+04:30) Kabul" string
// wstr2 = char2ws(str2), 
return (wstr1 == wstr2);

И не повезло.Строка в VSVC2008 IDE-отладчике визуально равна.

Вопрос : почему метод сравнения дает мне false всегда?

Спасибо.


Решение : большое спасибо Alexandre C.

bool weirdEquals(const std::wstring& str, char const* c)
{
    std::string c_str(c);
    if (str.size() < c_str.size())
    {
        return false;
    }
    return std::equal(c_str.begin(), c_str.end(), str.begin());
}

PS.Я сделал некоторые изменения.

Ответы [ 3 ]

1 голос
/ 21 февраля 2011

Чтобы сравнить строки, вам нужно сравнить их через один и тот же набор символов.wchar_t и char явно используют разные наборы символов, поэтому вы не можете сравнивать их с помощью обычного сравнения строк типа char-to-char.

Обычно вы конвертируете строку char* в wchar_t*строка (используя mbtowcs или MultiByteToWideChar), чтобы вы могли сравнивать их обе как строки Юникода, как вы делаете.

Но я подозреваю, что в вашем случае вы ожидаете, что простые символы ASCII всегда будут совпадать,в этом случае вы можете сделать сравнение между символами, сравнив wchar_t с char с.Примечание: не используйте для этого приведение.

Относительно того, почему ваше преобразование не работает, см. Ответ @ Эрика.

1 голос
/ 21 февраля 2011

Сравните так, если вы уверены, что у вас есть только символы ASCII. В противном случае вы можете передать пользовательский (зависящий от локали?) Компаратор в std::equal.

bool weirdEquals(char const* c, size_t n, const std::wstring& str)
{
    if (str.size() < n) return false;
    return std::equal(c, c + n, str.begin());
}
0 голосов
/ 21 февраля 2011

Вам нужно передать newsize, а не origsize, в mbstowcs_s.

Также рассмотрите возможность использования:

wchar_t wcstring[newsize] = { 0 };
...