winapi русские символы на кнопке

143
04 июня 2019, 15:00

Есть кнопка, создающаяся следующим кодом:

CreateWindowW(TEXT("BUTTON"), _T("Текст"),
    WS_CHILD | WS_VISIBLE,
    180, 50, 100, 50, hwnd, (HMENU)2, ((LPCREATESTRUCT)lParam)->hInstance, 0);

Если ввести русский текст в исходном коде, то все отображается корректно, но если взять его из файла или с сервера, то выводит крякозяблы.

1) Как узнать текущую кодировку строк в приложении

2) Как правильно перевести string в wstring?

Answer 1

Если сервер отсылает utf-8, то подойдет MultiByteToWideChar :

string x = *utf-8 string*;
wstring ww;
ww.resize(x.size());
MultiByteToWideChar(CP_UTF8, 0, x.c_str(), x.size(), &ww[0], ww.size());
CreateWindowW(L"BUTTON", ww.data(),
    WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP | BS_PUSHBUTTON,
    60, 50, 250, 50, hwnd, (HMENU)1, ((LPCREATESTRUCT)lParam)->hInstance, 0);

Иногда нужно распарсить unicode переданный в виде "\u0061\u0062\u0063", для этого подойдет следующий код:

char x16_NumToChar(int num)
{
    char var[] = "0123456789abcdef";
    return var[num];
}
int x16_CharToNum(char val)
{
    val = tolower(val);
    char var[] = "0123456789abcdef";
    for (size_t i = 0; i < strlen(var); i++)
    {
        if (var[i] == val) {
            return i;
        }
    }
    return -1;
}
wchar_t getUnicodeChar(string unicode) {
    if (unicode.size() != 6) { return 0; }
    if (unicode[0] != '\\' || unicode[1] != 'u') { return 0; }
    wchar_t res =
        x16_CharToNum(unicode[2]) * pow(16, 3) +
        x16_CharToNum(unicode[3]) * pow(16, 2) +
        x16_CharToNum(unicode[4]) * pow(16, 1) +
        x16_CharToNum(unicode[5]) * pow(16, 0);
    return res;
}
wstring parseUnicode(string unicode) {
    int stringSize = unicode.size() / 6;
    wstring res=L"";
    for (int i = 0; i < stringSize; i++)
    {
        res+=getUnicodeChar(unicode.substr(i*6, 6));
    }
    return res;
}

wstring ww = parseUnicode("\\u0061\\u0062\\u0063\\u0020\\u043F\\u0440\\u0438\\u0432\\u0435\\u0442");
CreateWindowW(L"BUTTON", ww.data(),
            WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP | BS_PUSHBUTTON,
            60, 50, 250, 50, hwnd, (HMENU)1, ((LPCREATESTRUCT)lParam)->hInstance, 0);

Подобным образом можно принимать от сервера текстовые unicode строки (часто отсылаются различными api) и выводить в windows приложении.

READ ALSO
Как установить библиотеку SFML для C++ на CLion?

Как установить библиотеку SFML для C++ на CLion?

Мне необходимо установить библиотеку SFML для C++ на CLion, так как Visual Studio мне не подходит по некоторым причинамКак можно это сделать?

134
Задача про Козла и площадь огорода. C++

Задача про Козла и площадь огорода. C++

Есть такая задача, условие нижеНаписал свой код - решение в 3 из 10 тестов неверное, формула вроде правильная, на тестовом условии тоже ответ...

110
Code::Blocks, Clang, C++, Windows 10, не может найти windows.obj

Code::Blocks, Clang, C++, Windows 10, не может найти windows.obj

Пытаюсь сделать GUI для своей программыПереключил тип с Console на GUI

121
Qt. Undefined reference to

Qt. Undefined reference to

Имеются следующие файлы:

143