Я читаю пользовательский ввод из GLFW с помощью обратных вызовов (устанавливается с помощью glfwSetCharCallback) в соответствии с этой страницей:
http://www.glfw.org/docs/latest/input.html#input_char
Функция обратного вызова получает нажатую клавишу как 32-разрядное целое число без знака. Как я могу преобразовать это в то, что я могу напечатать на моем экране? Я пробовал и codecvt из C ++ 11, и библиотеку ICU, но не смог заставить что-либо печатать читаемые символы на моем терминале.
Это код моей функции обратного вызова:
void InputManager::charInputCallback(GLFWwindow* window, unsigned int key)
{
UErrorCode errorStatus = U_ZERO_ERROR; //initialize to no error
UConverter *utf32toUnicode = ucnv_open("UTF-32", &errorStatus); //create converter utf-32 <=> Unicode
if(U_FAILURE(errorStatus))
std::cout << u_errorName(errorStatus) << std::endl;
UChar unicode[10] = {0};
ucnv_toUChars(utf32toUnicode, unicode, 10, (char*)key, 4, &errorStatus); // this fails with an U_ILLEGAL_ARGUMENT_ERROR
if(U_FAILURE(errorStatus))
std::cout << u_errorName(errorStatus) << std::endl;
std::cout << unicode << std::endl;
}
Если я ничего не делаю с вводом (ключом), ничего не отображается вообще. Просто пустая строка.
Вы вызываете ucnv_toUChars (), который преобразует 8-битную строку в Unicode. Но вам нужно пойти другим путем и преобразовать строку Unicode в 8-битную, например UTF-8. Я бы использовал класс UnicodeString, который имеет конструктор, принимающий UTF-32, и метод toUTF8String ().
Других решений пока нет …