Есть кнопка, создающаяся следующим кодом:
CreateWindowW(TEXT("BUTTON"), _T("Текст"),
WS_CHILD | WS_VISIBLE,
180, 50, 100, 50, hwnd, (HMENU)2, ((LPCREATESTRUCT)lParam)->hInstance, 0);
Если ввести русский текст в исходном коде, то все отображается корректно, но если взять его из файла или с сервера, то выводит крякозяблы.
1) Как узнать текущую кодировку строк в приложении
2) Как правильно перевести string в wstring?
Если сервер отсылает 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 приложении.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Мне необходимо установить библиотеку SFML для C++ на CLion, так как Visual Studio мне не подходит по некоторым причинамКак можно это сделать?
Есть такая задача, условие нижеНаписал свой код - решение в 3 из 10 тестов неверное, формула вроде правильная, на тестовом условии тоже ответ...
Пытаюсь сделать GUI для своей программыПереключил тип с Console на GUI